这就是我之前的内容
#include <stdio.h>
int main()
{
return 0;
}
我得到了这个
rohit:~/workspace/C $ size const
text data bss dec hex filename
1122 276 4 1317 525 const
进行以下更改后,数据部分的大小会增加4。
int main()
{
printf("Hello World!!");
return 0;
}
rohit:~/workspace/C $ size const
text data bss dec hex filename
1112 280 8 1400 578 const
这种行为的原因是什么。我在x86上使用Ubuntu。 gcc是编译器。
答案 0 :(得分:3)
TL; DR:每个使用过的字符串都使用内存本身,以及sizeof(char*)
附加内存用于指向其第一个字符的指针。
您可能使用32位架构,或者至少为该程序编译您的程序。四个字节恰好是该架构上的一个指针,所以让我们看一下汇编程序(gcc -S
):
.file "main.c"
.section .rodata
.LC0:
.string "Hello World!!"
有一个.rodata
条目,即"Hello World!""
作为.string
。这是一个const char *
,在32位x86拱门上占用四个字节。如果我们删除该字符串,.rodata
部分将保持为空。字符串消失了,因此我们可以摆脱指针。请注意,指针本身不是只读的。这就是为什么你最终会在data
开始使用条目的原因。
您可以使用gcc -Os main.c
轻松查看此内容。以下程序应具有相同的size
输出(并产生几乎相同的汇编程序代码):
#include <stdio.h>
int main()
{
printf("hello world!");
return 0;
}
#include <stdio.h>
int main()
{
const char * mystring = "hello world!";
printf(mystring);
return 0;
}
毕竟,我们需要printf
($.LC0
)的指针:
movq $.LC0, -8(%rbp)
movq -8(%rbp), %rax
movq %rax, %rdi
movl $0, %eax
call printf