我在x64机器上用cygwin GCC编译了下面的代码:
gcc main.c -o main
(main.c中)
long long mango = 13; // I also tried `char`, `short`, `int`
long melon = 2001;
void main()
{
}
然后我使用nm
转储符号值:
./main:0000000100402010 D mango
./main:0000000100402018 D melon
据我了解,符号的值仅表示其地址。因此mango
的地址为100402010
。 melon
的地址为100402018
。所以mango
应该占用8个字节。
我尝试了mango
的其他类型,例如char
,int
,short
。它总是占用8个字节。
为什么尺寸不会改变?
感谢评论。
我刚试过下面的代码:
typedef struct{
char a1;
char a2;
char a3;
char a4;
char a5;
} MyStruct;
MyStruct MyObj1={1,2,3,4,5};
MyStruct MyObj2={1,2,3,4,5};
long long mango = 13;
long melon = 2001;
void main()
{
}
这次,nm
向我展示了这一点:
./main:0000000100402020 D mango
./main:0000000100402028 D melon
./main:0000000100402010 D MyObj1
./main:0000000100402015 D MyObj2
MyObj1
和MyObj2
分隔5个字节。因此,确定由编译器决定填充。
答案 0 :(得分:2)
来自 GNU nm binary utilities: nm page :
符号值,以选项(见下文)选择的基数,或 十六进制默认情况下。符号类型。至少以下类型 使用;其他也是,取决于目标文件格式。如果 小写,符号通常是本地的;如果是大写,则符号为 全球(外部)。然而,有一些小写符号 显示特殊全局符号(u,v和w)。根据{{1}}设置和默认对齐边界,连续符号地址之间的距离可能是该符号
pragma
的字节数的精确值,也可能包括 padding ,它会增加符号的 sizeof 。
type
IMO在A
The symbol’s value is absolute, and will not be changed by further linking.
B
...
用语中使用 value 这个词是不幸的,因为在这个上下文中, value 用于描述符号的地址。符号(值)的地址不会改变。但在正常的C语言中,符号的值确实会发生变化,例如:
nm
关于地址的大小,64位构建的任何符号的地址总是具有8个字节的大小,而32位构建的任何符号的地址将具有4个字节的大小。这些大小不会更改,也不会为分配给它们的符号分配值。
关于各种符号之间在内存空间中的距离,此距离会受到符号的int i = 0; // the address for symbol i will remain constant
i = 10; // but the value of the symbol i can change.
,以及 aligned 沿着实现边界的影响,并且,正如您所注意到的,编译器:“因此确定由编译器决定填充。”取决于type
设置和默认对齐边界, {{3 }} 可能会导致连续符号的地址距离仅由pragma
或type
的 sizeof 值的组合引起的距离更大一个特定的符号。 (types
和char
类型符号非常常见)。