C++栈帧内存分析

        在没有打印内存布局时,自认为函数内定义的局部变量布局是按照定义顺序分布的,但是经过gdb调试发现自认为的巨大错误。

        定义一个函数

void testMem() {
    int i = 0;
    int v[3] = {0, 3, 10};
    int vv[4] = {4, 2, 2, 6};
    char d = 'c';
    int16_t k = 2;
    int j = 4;
    int jj = 10;
    char d2 = 'j';
}

        在函数结束的大括号出加断点,运行程序。然后打印整型变量i和j的地址,打印字符变量d和d2的地址,如下

(gdb) p &i
$5 = (int *) 0x7fffffffd5e8
(gdb) p &j
$6 = (int *) 0x7fffffffd5ec
(gdb) p &jj
$7 = (int *) 0x7fffffffd5f0

(gdb) p &d
$1 = 0x7fffffffd5e4 "cj\002"
(gdb) p &d2
$2 = 0x7fffffffd5e5 "j\002"

        从打印结果看,在编译时,编译器将局部变量按照类型进行布局,同类型的变量地址空间连续分布。并且,同类型的变量定义顺序与地址增长方向相同,即先定义的变量在低地址,后定义的变量在高地址。

        另外,可以发现,短字节(char)的变量分布在低地址,长字节(int)变量分布在高地址。据此,再做个测试,定义bool变量

void testMem() {
    int i = 0;
    int v[3] = {0, 3, 10};
    int vv[4] = {4, 2, 2, 6};
    bool bl = true;
    bool bt = false;
    char d = 'c';
    int16_t k = 2;
    int j = 4;
    int jj = 10;
    char d2 = 'j';
    char d3 = 'k';
}

        bool变量和char变量都占用一个字节,打印内存地址:

(gdb) p &bl
$1 = (bool *) 0x7fffffffd5e1
(gdb) p &bt
$2 = (bool *) 0x7fffffffd5e2
(gdb) p &d
$3 = 0x7fffffffd5e3 "cjk\002"

        再将bool值变量定义换个位置,定义在char变量之后,

void testMem() {
    int i = 0;
    int v[3] = {0, 3, 10};
    int vv[4] = {4, 2, 2, 6};
    char d = 'c';
    int16_t k = 2;
    int j = 4;
    int jj = 10;
    char d2 = 'j';
    char d3 = 'k';
    bool bl = true;
    bool bt = false;
}

        打印变量地址:

(gdb) p &bl
$1 = (bool *) 0x7fffffffd5e4
(gdb) p &bt
$2 = (bool *) 0x7fffffffd5e5
(gdb) p &d
$3 = 0x7fffffffd5e1 "cjk\001"
(gdb) p &d2
$4 = 0x7fffffffd5e2 "jk\001"
(gdb) p &d3
$5 = 0x7fffffffd5e3 "k\001"
(gdb) p &k
$6 = (int16_t *) 0x7fffffffd5e6

        从上述两段代码的执行结果看,字节长度相同的不同类型的变量,内存布局与定义顺序有关,先定义的变量在低地址,后定义的变量在高地址。

你可能感兴趣的:(c/c++,c++,开发语言)