在调试模式下,每当我创建这样的字符时,它在调试模式下都是4字节对齐,而在发布模式下,它始终是8字节对齐的。无论我是以32位构建模式还是64位运行它,都会发生这种情况。我正在使用Visual Studio 2017.但是我在Ideone.com在线编译器上尝试过它,它总是通过这个测试:
char charbuff[] = "h";
if ((unsigned long long)&charbuff[0] % 8ULL != 0) throw;
我知道字符串文字有一个额外的字节,我试过“hh”,唯一的区别是在32位构建模式下有时会失败(8字节对齐)。
新变量是否从未分配给至少4字节对齐的内存?这是语言或操作系统分配器的功能吗?
编辑:我将它放在主函数的堆栈中:
int main()
{
char charbuff[] = "hh";
char charbuff2[] = "hh";
char charbuff3[] = "hh";
if ((unsigned long long)&charbuff[0] % 8ULL != 0) throw;
if ((unsigned long long)&charbuff2[0] % 8ULL != 0) throw;
if ((unsigned long long)&charbuff3[0] % 8ULL != 0) throw;
}
这总是在发布模式下通过。在调试模式下,它将始终传递4字节对齐。在Ideone.com上,它总是通过这个。