c++ - 了解对齐概念

标签 c++ memory-alignment

An alignment is an implementation-defined integer value representing the number of bytes between successive addresses at which a given object can be allocated.

这个概念有点不清楚。例如:

struct B { long double d; };
struct D : virtual B { char c; }

When D is the type of a complete object, it will have a subobject of type B, so it must be aligned appropriately for a long double.

这是什么意思? sizeof(long double) 是那种情况下的字节数??

最佳答案

大多数 CPU 都有关于数据存储位置的“偏好”。读取或写入内存地址时,如果地址与您尝试写入的数据大小不匹配,操作可能会变慢(或完全非法)。例如,通常要求从可被 4 整除的地址开始分配 4 字节整数。

也就是说,存储在地址 7 上的 int 要么效率较低,要么完全非法,具体取决于您的 CPU。但如果它存储在地址 8,CPU 会很高兴。

这就是对齐表达的意思:对于 T 类型的任何对象,其地址必须被什么整除才能满足 CPU 的要求?”

在 C++ 中,对象的对齐由实现定义(因为,​​如上所述,它取决于 CPU 架构)。 C++ 只是说每个对象都有对齐方式,并描述了如何确定复合对象的对齐方式。

“为 long double 对齐”只是意味着必须分配对象,以便将其第一个字节放置在对 long double 有效的地址中.如果 CPU 体系结构指定 long double 的对齐方式为 10(例如),则意味着每个具有此对齐方式的对象都必须分配在可被 10 整除的地址上。

关于c++ - 了解对齐概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24765507/

相关文章:

c++ - sizeof 为我的结构提供了意想不到的结果

c++ - 获得对齐内存的最佳跨平台方法

c++ - 编译后的 boost_python 扩展无法在 python 2.7 中导入

javascript - Node ffi : Dynamic Linking Error

android - 未定义对 'cv::CascadeClassifier::detectMultiScale' 的引用,但其他库链接正确

c++ - 没有 edge_predicate 的 BOOST filtered_graph 中的 out_edges() 实现

c++ - 如何故意触摸内存页?

qt - 内存对齐 QVector().data()

c++ - 类的内存对齐

c++ - 是什么阻止了 __attribute__((packed)) 进入 ISO C/C++?