原则一:每个成员所放位置:结构体中元素是按照定义顺序一个一个放到内存中去的,但并不是紧密排列的。从结构体存储的首地址开始,每一个元素放置到内存中时,它都会认为内存是以它自己的大小来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始(以结构体变量首地址为0计算)。
原则二:最后结算:在经过第一原则分析后,检查计算出的存储单元是否为所有元素中最宽的元素的长度的整数倍,是,则结束;若不是,则补齐为它的整数倍。
转载地址:https://blog.csdn.net/u011404495/article/details/54837797
leetcode中描述更准确:
基本类型才需要自己宽度的整数倍上开始;
内存对齐:编译器将程序中的每个“数据单元”安排在字的整数倍的地址指向的内存之中
内存对齐的原则:
结构体变量的首地址能够被其最宽基本类型成员大小与对齐基数中的较小者所整除;
结构体每个成员相对于结构体首地址的偏移量 (offset) 都是该成员大小与对齐基数中的较小者的整数倍,如有需要编译器会在成员之间加上填充字节 (internal padding);
结构体的总大小为结构体最宽基本类型成员大小与对齐基数中的较小者的整数倍,如有需要编译器会在最末一个成员之后加上填充字节 (trailing padding)。
C++ sizeof(string) 基于VS2015编译器 转载地址:https://blog.csdn.net/sols000/article/details/103989637?utm_medium=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase&depth_1-utm_source=distribute.pc_relevant_bbs_down.none-task-blog-baidujs-1.nonecase
名称 | X86 (字节数) | X64(字节数) |
Allocator | 4 | 8 |
原始字符传 Data 位置 | 15+1 最多包含15个字符加一个结束符‘\0’ | 15+1 最多包含15个字符加一个结束符‘\0’ |
字符长度 Size | 4 | 8 |
当前容量 Capacity | 4 | 8 |
总计 | 28 | 40 |