课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
深圳达内告诉你 C struct类型,深圳IT培训(sz.tedu.cn)专家就针对C struct类型这一问题做一个详细的分解。希望能在工作中对你有所帮助!
C struct 类型在 C++ 中也是类,只是每个成员都是 POD 类型[2],所有数据成员public 访问,没有复杂数据成员,也没有定义方法。这种类的大小取决于数据成员的类型大小总和和内存对齐引入的 padding 大小,这个也是为了和 C 语言兼容。
对于下面这段示例代码,简单说明一下,Line 3~5中直接在类定义中对数据成员初始化是 C++11 引入的特性;HexDump 是一个小函数,传入一个对象的地址,打印对象在内存中的实际内容;本文中所有示例代码编译执行环境是 64 位 ubuntu 14.04 ,编辑器为 g++。
Listing 2 - C struct
1 class A { 2 public: 3 int a = 0x12345678; 4 char b = 'b'; 5 float c = 12.5; 6 }; 7 8 int main() { 9 A t;1011 printf("sizeof(t) = %ld\n", sizeof(t));12 printf("&t = %p\n", &t);13 printf("&t.a = %p\n", &t.a);14 printf("&t.b = %p\n", &t.b);15 printf("&t.c = %p\n", &t.c);16 HexDump(&t);1718 return 0;19 }// output as below:// sizeof(t) = 12// &t = 0x7ffeb3c3f3d0// &t.a = 0x7ffeb3c3f3d0// &t.b = 0x7ffeb3c3f3d4// &t.c = 0x7ffeb3c3f3d8// 0x7ffeb3c3f3d0: 0x78 0x56 0x34 0x12 0x62 0x00 0x00 0x00 // 0x7ffeb3c3f3d8: 0x00 0x00 0x48 0x41
从输出结果,我们可以看到类A的大小为12
sizeof(A) = sizeof(int) + sizeof(char) + padding + sizeof(float)
从内存布局可以看到,数据存放顺序和类中定义的次序一致。从 b 和 c 对应的地址,可以看出有3个字节的 padding,具体内存对齐规则可以参考相关资料[3]。
这里顺便提一下静态数据成员,引入静态成员并不会影响到一个类的大小,因为它并不和具体的对象绑定,相比全局静态数据而言,简单地说只是多了一层访问控制。
想知道更多关于IT行业的信息吗?想远远不如行动,行动起来,一起加入达内,一起进入IT行业,跟着达内的脚步,一起走进如今的互联网信息时代,带给你不一样的色彩生活——【深圳IT培训】