0

刚刚注意到一些对我来说很奇怪的东西。默认情况下,Visual C++ 不会将对象对齐在其所需的边界中。例如 long long 与 4 字节边界对齐,而 __alignof(T) 返回 8(据我所知,它总是返回类型的大小)。所以看起来它没有正确对齐。例如

long long a1;
char g;
long long a2;
// alignment check for &a2 fails
if (((uintptr_t)&a2 & (__alignof(long long) - 1)) != 0) // failed

我还尝试仅打印指针,其值为&a20x0035F8FC3537148dec 为单位)。

有什么我错了吗?我需要正确对齐的 long long 类型的对象。我能做些什么呢?我可以使用__declspec(align())微软扩展,但它需要文字数字,所以我不能写这样的东西。

__declspec(align(__alignof(long long))) long long object;
4

2 回答 2

2

VC 不保证变量的自动堆栈对齐,最多将变量对齐到堆栈对齐(通常在 32 位系统上为 4 个字节)。如果需要特殊对齐,则需要使用__declspec(align(x)),就像 MSVC 的 SSE 类型(如__m128),否则需要_aligned_malloc使用

于 2011-02-16T07:30:32.807 回答
0

对齐应该最小化 RAM 访问的内存周期。4 字节对齐仅使用两个 32 位访问 long long. 8 字节对齐不会改善行为。编译器有一个默认对齐方式,可以用该/Zp选项覆盖。

另请参阅:配置属性 C/C++ 代码生成结构成员对齐。

于 2011-02-16T07:12:32.697 回答