使用这个简单的 C 程序
const char s1[] = "hello",
s2[] = "there";
并使用gcc -c a.c -O0 -o a.o
产生.rodata
包含以下内容:
'hello\x00there\x00'
,这是我所期望的。每个字符串占用 6 个字节,共 12 个字节。
但是,如果我将第二个字符串更改为"there s"
,如下所示:
const char s1[] = "hello",
s2[] = "there s";
,.rodata
包含以下内容:
'hello\x00\x00\x00there s\x00'
将额外的 2 个空填充字节添加到s1
.
我假设添加它们是为了将第一个字符串与 8 字节边界对齐(因为我在 64 位平台上)——尽管我可能错了?
然后我的问题出现了——为什么在第一个例子中没有这样做?为什么不在每个字符串的末尾添加 2 个额外的填充字节以使它们达到 8 字节边界?
所有示例均在 amd64/linux/gcc 机器上进行。