我试图理解为什么对齐在处理数据结构时很重要以及为什么它会影响内存访问性能。我偶然发现了一种 C 语法,
__attribute__((packed));
,据我所知,它指示编译器不要填充额外的位进行对齐。
说:
struct sampleStruct{
uint8_t foo;
uint8_t anotherFoo;
};
foo
和 anotherFoo
等于 16 位,但添加额外的 16 位以与 32 位处理器的自然字大小保持一致。
好吧,让我们添加另一个数据结构:
struct anotherStruct{
uint8_t fooZero;
uint8_t fooOne;
}__attribute__((packed));
struct sampleStruct{
uint8_t foo;
uint8_t anotherFoo;
};
我的问题是,初始化打包数据结构时是否会影响其他数据结构在内存中的对齐方式?
struct
,而第二个程序具有对齐的 struct
,该怎么办?它会在内存中留下“间隙”还是另一个struct
未对齐?抱歉问了这个愚蠢的问题。这让我困惑了相当长一段时间。我想知道内存对齐是如何工作的以及它如何影响处理器访问内存。
一般来说,占用 n 字节的变量如果驻留在可被 n 整除的地址,则可以更有效地从内存中读取/写入。在某些处理器(尤其是非 x86)上尝试以未对齐的方式读取/写入可能会导致硬件陷阱。
因此,虽然打包结构可以减小其大小,但这通常意味着内存访问速度较慢(如果可以进行访问)。
打包结构通常不会影响其他结构或其他类型。每种不同的类型,无论是“基”类型还是派生类型,都有自己的对齐方式,因此一种类型的变量如何放置在内存中对于其他类型的变量如何放置在内存中没有真正的影响。
至于其他进程,它们是完全独立的,因此一个进程的内部数据结构不会对另一个进程的内部数据结构产生任何影响。