St.*_*rio 4 c++ memory-alignment
对齐是实现定义的整数值,表示可以分配给定对象的连续地址之间的字节数.
这个概念有点不清楚.例如:
struct B { long double d; };
struct D : virtual B { char c; }
Run Code Online (Sandbox Code Playgroud)
当D是完整对象的类型时,它将具有类型B的子对象,因此它必须适当地对齐a
long double.
这是什么意思?sizeof(long double)是那种情况之间的字节数?
大多数CPU都有关于数据存储位置的"偏好".读取或写入存储器地址时,如果地址与您尝试写入的数据大小不匹配,则操作可能会更慢(或完全非法).例如,通常要求从可被4整除的地址开始分配4字节整数.
也就是说,根据您的CPU ,int存储的地址7效率较低或完全非法.但如果它存储在地址8,CPU很高兴.
这就是对齐表达的对象:对于任何类型的对象,T它的地址必须能被整除,以满足CPU的要求吗?"
在C++中,对象的对齐是实现定义的(因为,如上所述,它取决于CPU架构).C++只是说每个对象都有一个对齐,并描述了如何确定复合对象的对齐方式.
"为a"对齐long double只是意味着必须分配对象,以便将其第一个字节放在对a有效的地址中long double.如果CPU体系结构将a的对齐指定long double为10(例如),那么这意味着必须将具有此对齐的每个对象分配到可被10整除的地址.