如何管理C语言中未声明实体的内存?

如何管理C语言中未声明实体的内存?,c,memory,C,Memory,例如:在下面的代码中,如何以及在何处存储用于比较的数字“10” #include<stdio.h> #include<conio.h> int main() { int x = 5; if (x > 10) printf("X is greater than 10"); else if (x < 10) printf("X is lesser than 10"); else pri

例如:在下面的代码中,如何以及在何处存储用于比较的数字“10”

#include<stdio.h>
#include<conio.h>

int main()
{
    int x = 5;
    if (x > 10)
        printf("X is greater than 10");
    else if (x < 10)
       printf("X is lesser than 10");
    else
        printf("x = 10");
    getch();
    return 0;
}
#包括
#包括
int main()
{
int x=5;
如果(x>10)
printf(“X大于10”);
否则如果(x<10)
printf(“X小于10”);
其他的
printf(“x=10”);
getch();
返回0;
}

请原谅我没有提供足够的细节。与直接用“5”初始化“x”不同,如果我们扫描并从用户处获取它,我们知道如何为“x”分配内存。但是如何为没有存储在任何变量中的文字数字“10”分配内存?

常量10可能作为立即数存储在操作码流中。发出操作码中包含常数的
CMP AX,10
,通常比
CMP AX、[BX]
小且快,后者必须从内存加载比较值


如果常量太大,无法放入操作码中,另一种方法是将其像静态变量一样存储在内存中,但如果指令集允许嵌入常量,一个好的编译器应该使用它-毕竟,添加这种寻址模式可能是因为它比其他模式有优势。

在您的特定代码中,
x
被初始化为5,并且从未更改。一个组织能够收集和传播这些信息。因此,它可能会产生相当于

int main() {
 printf("X is lesser than 10");
 getch();
 return 0;
}
请注意,编译器也会这样做

所以常数5和10都消失了

顺便说一句,
getch
不在标准C99或C11中。我的Linux系统没有它们

通常(取决于目标处理器和)小常量通常嵌入到某条指令中(作为直接操作数),例如。一些大常量(例如浮点数、文字字符串、most
const
global或
static
数组和聚合)可能被插入并编译为中的只读数据(那么机器寄存器加载指令中的常量将是相对于for的地址或某些偏移量);另见。一些体系结构(例如,、和其他)能够通过两个连续的指令(将常量分为两部分加载)在寄存器中加载宽常量,这会影响的格式(例如in和,通常in)

我建议让编译器发出汇编代码,并浏览一下汇编代码。如果使用(例如在Linux上,或与或一起使用),请尝试使用
gcc-Wall-O-fverbose asm-S进行编译;在我的Debian/Linux系统上,如果我将代码中的
getch
替换为
getchar
,我将得到:

        .section        .rodata.str1.1,"aMS",@progbits,1
.LC0:
        .string "X is lesser than 10"
        .text
        .globl  main
        .type   main, @function
main:
.LFB11:
        .cfi_startproc
        subq    $8, %rsp        #,
        .cfi_def_cfa_offset 16
        movl    $.LC0, %edi     #,
        movl    $0, %eax        #,
        call    printf  #
        movq    stdin(%rip), %rdi       # stdin,
        call    _IO_getc        #
        movl    $0, %eax        #,
        addq    $8, %rsp        #,
        .cfi_def_cfa_offset 8
        ret
        .cfi_endproc
.LFE11:
        .size   main, .-main
        .ident  "GCC: (Debian 4.9.2-10) 4.9.2"
        .section        .note.GNU-stack,"",@progbits
如果您使用的是64位Windows系统,那么您的体系结构很可能是。关于ISA(请参见答案)和Linux(以及Linux;您可以找到Windows的等效文档)的描述有很多


顺便说一句,您不应该真正关心这些常量是如何实现的。无论编译器为实现它们而选择做什么,代码的长度都不应该改变。因此,将优化(以及此类低级选择)留给编译器(即您的C实现)。

与您的代码无关,但“X小于10”是语法上正确的说法。撇开“按语言”不谈。这是实施者需要解决的问题。旁白2:你的问题可能会出现在你的问题中,即使它碰巧也出现在标题中。
x
声明了,你到底是什么意思?“实体”是什么意思?请阅读声明和定义。这些都有明确定义的含义,不仅仅是在C中。我认为这是因为这是在询问一种语言的技术实现细节,而不是用这种语言编写的软件的代码质量或设计权衡。“另一种方法是将其像静态变量一样存储在内存中”-还有更多的选择。您可能会发出一个或两个指令来在寄存器中构造正确的值(例如7+3,如果10对于一个立即数来说太大了,因为限制是7),然后进行比较。我发现在线查看源代码和不同的编译器通常很有用—本质上是一个gcc fiddle站点。没有优化:有了
-O2
:@MichaelT:我知道
gccbot
,但我更喜欢在答案中复制代码……而且有些编译器是特殊的,@Kevin我不确定似乎是编译器错误的东西是否与此相关。+1建议(a)不要在意/信任编译器,以及(B)如果您还有问题,请检查生成的机器代码。虽然我认为后者对新手来说可能是一个令人望而生畏的前景,但没有比这更好的开始时间了:-)