TOP

C++sizeof使用规则及陷阱分析(5)
2014-11-12 18:00:06 】 浏览:8985
Tags:sizeof 使用 规则 陷阱 分析

  类class中的sizeof特别探讨


  写在前面,本节假设你看过《Inside the C++ Object Model》,如果没有,最好了解类与对象在内存中map问题


  这里引用《Inside the C++ Object Model》中的对象模型的内存镜像图:


  (一)不考虑继承关系(单继承、多继承、虚继承等)


  (1)不带virtual函数时


  空类:


  1 class A


  2 {


  3


  4 };


  5


  6 cout << sizeof(A) << endl; // 1


  空类总是返回1


  1 class B {


  2 private :


  3 int value;


  4 double a;


  5 public:


  6


  7 };


  8


  9 cout << sizeof(B) << endl; //16


  10


  和struct一样,也要考虑对齐问题,以及成员的顺序因为成员函数不会分配空间,所以sizeof时只计算数据成员的大小


  (2)带virtual函数时


  单继承情况下,只要class中存在virtual函数,编译器在编译时就会自动插入一个指向虚函数表的指针vptr(大小为4字节). 不同的编译器vptr插入的位置可能不同,VC编译器插入vptr的位置一般是数据成员开始。


  下例在MinGW Develper Studio2.05(gcc)下编译,VC 6.0编译器下结果为24 24, 我不太理解为什么...


  1 class A


  2 {


  3 public:


  4 virtual void foo() {}


  5 private:


  6 int m1;


  7 double m2;


  8 };


  9


  10 class B


  11 {


  12 public:


  13 virtual void foo() {}


  14 private:


  15 double m2;


  16 int m1;


  17 };


  18


  19


  20 cout << sizeof(A) << endl; // 16


  21 cout << sizeof(B) << endl; // 24



C++sizeof使用规则及陷阱分析(5) https://www.cppentry.com/bencandy.php?fid=80&id=11904

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Unicode快速指引 下一篇C++虚函数机制分析