添加printf会增加数据段的大小

时间:2017-10-11 10:21:31

标签: c gcc memory

这就是我之前的内容

#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是编译器。

1 个答案:

答案 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