Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 静态字符比静态整数分配更多的磁盘内存_C_Static_Allocation - Fatal编程技术网

C 静态字符比静态整数分配更多的磁盘内存

C 静态字符比静态整数分配更多的磁盘内存,c,static,allocation,C,Static,Allocation,我写了一个空程序并编译了它。 它分配了12.456字节的磁盘内存 int main(void) { static int int1; } 然后我添加了静态整数,大小增加了32字节(大小现在是12.488字节)。但是当我添加静态字符时,大小增加了40字节。为什么静态字符比静态int分配更多的磁盘内存 编辑: 我在x86_64机器上运行GNU编译器。 这是消息来源 int main(void) { } 分配:12456 B磁盘内存 int main(void) { stati

我写了一个空程序并编译了它。 它分配了12.456字节的磁盘内存

int
main(void) {
    static int int1;
}

然后我添加了静态整数,大小增加了32字节(大小现在是12.488字节)。但是当我添加静态字符时,大小增加了40字节。为什么静态字符比静态int分配更多的磁盘内存

编辑:

我在x86_64机器上运行GNU编译器。 这是消息来源

int
main(void) {

}
分配:12456 B磁盘内存

int
main(void) {
    static int int1;
}
分配:12488字节(+32 B)


分配:12528字节(+40b)

,因为变量的名称存储在二进制文件中用于调试。假设您是使用
-g
编译的,或者如果您不进行优化,编译器会自动插入调试符号。如果使用十六进制编辑器查看二进制文件,可以看到这一点

这是第一个没有变量的程序的结尾。第一列是文件中的十六进制位置。接下来的八个是文件中的十六进制值。最后一列是它的ASCII表示形式。这是通过使用。详细信息会有所不同,这在OSX上有
clang-g

000010e0: 0000 0000 0000 0000 2000 5f5f 6d68 5f65  ........ .__mh_e
000010f0: 7865 6375 7465 5f68 6561 6465 7200 5f6d  xecute_header._m
00001100: 6169 6e00 6479 6c64 5f73 7475 625f 6269  ain.dyld_stub_bi
00001110: 6e64 6572 002f 5573 6572 732f 7363 6877  nder./Users/schw
00001120: 6572 6e2f 746d 702f 0074 6573 742e 6300  ern/tmp/.test.c.
00001130: 2f76 6172 2f66 6f6c 6465 7273 2f30 622f  /var/folders/0b/
00001140: 3778 7032 6c78 6264 3779 6c30 7463 706d  7xp2lxbd7yl0tcpm
00001150: 7330 3666 7233 6434 3030 3030 676e 2f54  s06fr3d40000gn/T
00001160: 2f74 6573 742d 6439 6332 6233 2e6f 005f  /test-d9c2b3.o._
00001170: 6d61 696e 0000 0000                      main....
这是第二个,只需
int1

00002100: 0000 0000 0000 0000 2000 5f5f 6d68 5f65  ........ .__mh_e
00002110: 7865 6375 7465 5f68 6561 6465 7200 5f6d  xecute_header._m
00002120: 6169 6e00 6479 6c64 5f73 7475 625f 6269  ain.dyld_stub_bi
00002130: 6e64 6572 002f 5573 6572 732f 7363 6877  nder./Users/schw
00002140: 6572 6e2f 746d 702f 0074 6573 742e 6300  ern/tmp/.test.c.
00002150: 2f76 6172 2f66 6f6c 6465 7273 2f30 622f  /var/folders/0b/
00002160: 3778 7032 6c78 6264 3779 6c30 7463 706d  7xp2lxbd7yl0tcpm
00002170: 7330 3666 7233 6434 3030 3030 676e 2f54  s06fr3d40000gn/T
00002180: 2f74 6573 742d 3136 6564 3035 2e6f 005f  /test-16ed05.o._
00002190: 6d61 696e 005f 6d61 696e 2e69 6e74 3100  main._main.int1.
000021a0: 5f6d 6169 6e2e 696e 7431 0000 0000 0000  _main.int1......
第三个是
int1
char1

00002120: 0000 0000 0000 0000 2000 5f5f 6d68 5f65  ........ .__mh_e
00002130: 7865 6375 7465 5f68 6561 6465 7200 5f6d  xecute_header._m
00002140: 6169 6e00 6479 6c64 5f73 7475 625f 6269  ain.dyld_stub_bi
00002150: 6e64 6572 002f 5573 6572 732f 7363 6877  nder./Users/schw
00002160: 6572 6e2f 746d 702f 0074 6573 742e 6300  ern/tmp/.test.c.
00002170: 2f76 6172 2f66 6f6c 6465 7273 2f30 622f  /var/folders/0b/
00002180: 3778 7032 6c78 6264 3779 6c30 7463 706d  7xp2lxbd7yl0tcpm
00002190: 7330 3666 7233 6434 3030 3030 676e 2f54  s06fr3d40000gn/T
000021a0: 2f74 6573 742d 3036 3865 3366 2e6f 005f  /test-068e3f.o._
000021b0: 6d61 696e 005f 6d61 696e 2e69 6e74 3100  main._main.int1.
000021c0: 5f6d 6169 6e2e 6368 6172 3100 5f6d 6169  _main.char1._mai
000021d0: 6e2e 696e 7431 005f 6d61 696e 2e63 6861  n.int1._main.cha
000021e0: 7231 0000 0000 0000                      r1......
如果没有
-g
,也没有任何优化标志,我会得到一个类似但不太冗长的结果

00002080: 0000 0000 0000 0000 2000 5f5f 6d68 5f65  ........ .__mh_e
00002090: 7865 6375 7465 5f68 6561 6465 7200 5f6d  xecute_header._m
000020a0: 6169 6e00 6479 6c64 5f73 7475 625f 6269  ain.dyld_stub_bi
000020b0: 6e64 6572 005f 6d61 696e 2e69 6e74 3100  nder._main.int1.
000020c0: 5f6d 6169 6e2e 6368 6172 3100 0000 0000  _main.char1.....
如果我编译时没有使用
-g
-O
进行优化,那么将没有符号,因为编译器不会保留用于调试的变量名,也因为优化器将删除未使用的变量

00001060: 0000 0000 0000 0000 2000 5f5f 6d68 5f65  ........ .__mh_e
00001070: 7865 6375 7465 5f68 6561 6465 7200 5f6d  xecute_header._m
00001080: 6169 6e00 6479 6c64 5f73 7475 625f 6269  ain.dyld_stub_bi
00001090: 6e64 6572 0000 0000                      nder....

这三个程序都是等效的,使用
clang-O
生成完全相同的二进制文件。我假设
gcc
也会这样做。

如果源代码不是太大的话。你能分享一下吗?我想看看这不是一个纯粹的C问题,而是一个C++问题。我可以猜到它们是什么,但是你应该添加标签(可能还应该提供程序的源代码)来澄清和避免错误的假设。“如果源代码不是太大的话”?它就在你面前,大约20个字节:-)我想我们可以处理(除非它是
#包括“bigfile”
)。嗯,让我看看。。。40/32=5/4和
sizeof({'c','h','a','r','0'})==5
sizeof({'i','n','t','0'})==4
。。。光明会给你发了密码吗?@ArmenAvetisyan,我编辑过。