C ++编译器如何编译变量名?

时间:2012-02-19 18:02:57

标签: c++ variables compiler-construction

我知道我没有说清楚。我认为,我的疑问可归纳为:

在可执行文件(机器代码)中,“变量”是如何表示的?它们是静态内存地址吗?编译器是否为每个人提供了一个特定的“名称”(或只保留你给他们的名字)?

在代码中表示:

 int x=5;
 //Bunch of code
 cin>>y;
 cout<<x+1;

每台机器中的程序如何知道哪个地址将保持值5,保持输入的值,将1加到现有的值,最后打印相同的值。

- 若昂

3 个答案:

答案 0 :(得分:7)

这是特定于实现的。

通常,变量的位置将基于各种因素和优化。它们可能根本不存在于RAM中,因为它们可能被优化为完全存在于寄存器中,或完全优化。

运行时不存在变量名称;它们在编译期间被丢弃。但是,编译器可能会发出存储在应用程序二进制文件中的调试信息,以允许开发人员调试应用程序。但是,这通常会在发布版本中删除。

我不知道Gameshark的具体细节。但在许多情况下,可以通过查看应用程序的机器代码来计算特定变量的位置。

答案 1 :(得分:7)

这是C中的一个简单程序:

int main() {
    int a = 5;
    int b = 7;

    int c = a + b;

    return 0;
}

如果你在Linux下用gcc -m32 -S -O0 -o main.s main.c编译它,你会得到类似的东西

    .file   "main.c"
    .text
    .globl  main
    .type   main, @function
main:
.LFB0:
    /* %ebp is a Base Pointer Register */
    pushl   %ebp
    movl    %esp, %ebp

    /* Here we reserve space for our variables */
    subl    $16, %esp

    /* a's address is %ebp - 4 */
    movl    $5, -4(%ebp)

    /* b's address is %ebp - 8 */
    movl    $7, -8(%ebp)

    /* a + b */
    movl    -8(%ebp), %eax
    movl    -4(%ebp), %edx
    addl    %edx, %eax

    /* c's address is %ebp - 12 */
    movl    %eax, -12(%ebp)

    /* return 0 */
    movl    $0, %eax
    leave
    ret

如您所见,在这种情况下,变量的地址被计算为函数的基指针的偏移量。如果启用优化,则变量的值可以存储在寄存器中。

答案 2 :(得分:1)

所以这有两个部分,我会尽我所能。

编译时,编译器会将C ++代码转换为内部表示形式。然后将其转换为尽可能高效地使用CPU寄存器,并将其余数据推送到RAM中。当程序执行时,来自ram的数据将被来回复制到寄存器中。

关于你的另一个问题,我见过人们使用的一种方法是用户拥有的黄金。程序可以占用游戏的整个存储空间并复制它。然后,用户做一些事情(一个最小的动作)来获得或失去金币。然后,外部应用程序在整个存储空间中搜索已更改的值,以及之前的原始金量,以及现在的当前金量。一旦找到这个位置,他们就可以编辑内存位置并用他们想要的任何值更新它。

一般来说,游戏越复杂,方法就越难。