gpt4 book ai didi

c - 数据对齐: where can it be read off?可以改吗?

转载 作者:行者123 更新时间:2023-12-03 17:10:21 25 4
gpt4 key购买 nike

这是一本关于内存中原始类型数据对齐的书。

Microsoft Windows imposes a stronger alignment requirement—any primitive object of K bytes, for K = 2, 4, or 8, must have an address that is a multiple of K. In particular, it requires that the address of a double or a long long be a multiple of 8. This requirement enhances the memory performance at the expense of some wasted space. The Linux convention, where 8-byte values are aligned on 4-byte boundaries was probably good for the i386, back when memory was scarce and memory interfaces were only 4 bytes wide. With modern processors, Microsoft’s alignment is a better design decision. Data type long double, for which gcc generates IA32 code allocating 12 bytes (even though the actual data type requires only 10 bytes) has a 4-byte alignment requirement with both Windows and Linux.

问题是:

  1. 是什么强加了数据对齐,是操作系统还是编译器?
  2. 我可以更改它还是修复它?

最佳答案

一般来说,强加对齐的是编译器。每当您声明原始类型(例如 double)时,编译器都会自动将其对齐到堆栈中的 8 个字节。

此外,内存分配通常也与最大的原始类型对齐,因此您可以安全地执行此操作:

double *ptr = (double*)malloc(size);

无需担心对齐问题。

因此,一般来说,如果您有良好的编程习惯,就不必担心对齐问题。使某些东西错位的一种方法是做这样的事情:

char *ch_ptr = (char*)malloc(size);

double *d_ptr = (double*)(ch_ptr + 1);

有一些异常(exception)情况:当您开始使用 SSE 和矢量化时,事情会变得有点困惑,因为 malloc 不再保证 16 字节对齐。


为了覆盖某些东西的对齐方式,MSVC 有 declspec(align)允许这样做的修饰符。它用于增加某物的排列。 虽然我不确定它是否可以让你 减少基本类型的对齐。 它明确表示你不能使用这个修饰符减少对齐。


编辑:

我找到了说明 GCC 上 malloc() 对齐方式的文档:

The address of a block returned by malloc or realloc in the GNU system is always a multiple of eight (or sixteen on 64-bit systems).

来源:http://www.gnu.org/s/hello/manual/libc/Aligned-Memory-Blocks.html

是的,GCC 现在对齐到至少 8 个字节。

关于c - 数据对齐: where can it be read off?可以改吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8513508/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com