6月1日 10:35
C语言结构体和C++ class 有什么区别?内存对齐/柔性数组详解
在C语言中,结构体只能定义数据成员,不能包含成员函数,默认所有成员对外可见。C++中struct和class的唯一语法区别是默认访问权限:struct成员默认public,class成员默认private;默认继承权限也同理,struct默认public继承,class默认private继承。除此之外两者功能完全等价——C++的struct同样可以有构造函数、析构函数、虚函数、继承。内存对齐方面,编译器按成员声明顺序和各自对齐要求布局,通常按最大成员对齐,可用#pragma pack或alignas调整。位域允许在结构体中以位为单位指定成员宽度,节省空间但牺牲可移植性。柔性数组是结构体末尾的未指定长度数组,配合malloc动态分配,实现变长结构体。选择原则:纯数据聚合用struct,需要封装和行为的类型用class。
追问
内存对齐的规则是什么?
每个成员的偏移量必须是该成员对齐要求的整数倍,结构体总大小必须是最大对齐要求的整数倍。对齐要求通常等于成员大小(int为4,double为8)。对齐是为了CPU高效访问,未对齐访问在某些架构上会触发异常。
柔性数组和指针有什么区别?
柔性数组的内存与结构体连续分配,一次malloc搞定;指针需要额外一次分配,且内存不连续。柔性数组少一次内存间接访问,缓存更友好,但不能直接赋值和拷贝结构体。
什么时候用前向声明?
结构体互相引用或减少头文件依赖时使用前向声明(struct Foo;)。前向声明后只能声明指针或引用,不能访问成员或创建对象,因为编译器不知道大小。
C语言中结构体可以比较相等吗?
不行。C语言不支持结构体直接用==比较,需要逐成员比较或用memcmp。但memcmp在含有填充字节时可能不可靠,因为填充内容不确定。正确做法是逐字段比较。