📜  Compile Time 和 Execution Time 地址绑定的区别(1)

📅  最后修改于: 2023-12-03 15:00:00.676000             🧑  作者: Mango

Compile Time 和 Execution Time 地址绑定的区别

在计算机科学中,编译时(Compile Time)地址绑定和运行时(Execution Time)地址绑定是非常重要的概念。这两种地址绑定方式有着不同的特点,本文将详细介绍它们之间的区别。

Compile Time 地址绑定

编译时地址绑定指的是,在程序编译期间,程序中的各种符号(如变量、函数等)被绑定到内存地址上。在这种情况下,程序执行时不会发生动态地址分配。这意味着,程序一旦被编译完成,就要确定变量和函数的地址,而这些地址在程序执行期间是不可改变的。

编译时地址绑定的优点是执行速度很快,因为程序中的各种符号在编译时就被确定了它们的内存地址。此外,在编译时地址绑定中,程序中的符号在链接时就已经与程序中的其他模块链接在一起了。

代码中可以通过符号表查看符号地址是否已经确定。

#include <stdio.h>
 
static int x = 10; // 静态全局变量,存储在全局数据区,其地址在编译时已确定
 
int main()
{
    static int y = 20; // 静态局部变量,其地址在编译时已确定
 
    int z = 30; // 局部变量,其地址在编译时已确定
    
    printf("Address of x: %p\n", &x); // 输出静态全局变量的地址
    printf("Address of y: %p\n", &y); // 输出静态局部变量的地址
    printf("Address of z: %p\n", &z); // 输出局部变量的地址
    
    return 0;
}

输出:

Address of x: 0x60104c
Address of y: 0x601050
Address of z: 0x7ffcaaa2aac4

从结果可以看出,静态全局变量和静态局部变量的地址是在编译时就被确定了,而局部变量的地址是在运行时动态分配的。

Execution Time 地址绑定

运行时地址绑定是指程序执行时进行动态地址分配。在这种情况下,程序中的变量和函数的地址是在程序执行期间动态确定的。

运行时地址绑定的优点是程序更加灵活。由于程序中的变量和函数的地址是在执行期间动态确定的,因此可以灵活地分配内存空间。此外,在运行时地址绑定中,引用符号时使用的是间接地址。

代码中可以使用指针来动态确定地址。

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int* ptr = (int*)malloc(sizeof(int)); // 使用动态内存分配,动态确定变量的地址
    
    printf("Address of ptr: %p\n", &ptr); // 输出变量的地址
    printf("Address stored in ptr: %p\n", ptr); // 输出指向堆内存的指针值
    
    free(ptr); // 释放内存
 
    return 0;
}

输出:

Address of ptr: 0x7fffe893b698
Address stored in ptr: 0x5657fa189260

从结果可以看出,变量的地址是在程序执行期间动态确定的,而指针存储的是动态分配内存块的地址。

总结

Compile Time 地址绑定和 Execution Time 地址绑定是计算机科学中非常重要的概念。两者有着不同的特点和优缺点。在实际编程中,我们需要根据实际情况选择合适的地址绑定方式。