C和C++ 变量内存
Posted kylinhu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C和C++ 变量内存相关的知识,希望对你有一定的参考价值。
当我们在C或C++ 代码中定义了一个 int /long 类型的变量时,计算机会在内存中分配一段连续的内存来保存变量的值。(int 占用的内存大小和编译器位数有关,16位占用2个字节,32位占用4个字节, long 在32位编译器占用4个字节,64位编译器占用8个字节)。
#include <stdio.h> int main()
int i = 1;
int j = -2;
long l = 3, m = 4;
printf("Hello world sizeof(i)=%d, sizeof(j)=%d, sizeof(l)=%d, sizeof(m)=%d!\\n", sizeof(i), sizeof(j), sizeof(l), sizeof(m));
以上为我们在 hello world 基础上添加了一段扩展代码,用来打印变量占用字节。
我安装的 redhat 是64位,编译32位程序时使用
g++ -m32 test.cc -o test32 -g
输出结果
[**********]$ ./test Hello world sizeof(i)=4, sizeof(j)=4, sizeof(l)=8, sizeof(m)=8!
默认编译位64位程序。(如果linux是32位, -m64 生产64位程序)
g++ test.cc -o test -g
输出结果
[**********]$ ./test32 Hello world sizeof(i)=4, sizeof(j)=4, sizeof(l)=4, sizeof(m)=4!
-g是为了生产调试信息, 如果使用 gdb 调试程序,输入 gdb test
在第7行加入断点,运行到这里时会暂停。这时我们可以查看变量,内存等
i和j, l 和 m 的地址之间距离分别为 int 和 long 的字节数。
我们想查看变量在内存中保存的二进制值可以在 gdb 中使用 x/t &i 来达到目的
因为 j 是负数,保存样式和别的值区别大一些。(涉及反码,补码等内容会在后续说明)
在代码中定义的变量在 main 函数的函数体中,这种变量是保存在stack 中的,我们能看到在 stack 中的内存是从高位开始分配,如果是在 heap 上分配内存会从低位开始往高位分配,关于内存这方面的内容也会在后续文档中详细介绍。
以上示例是为了告诉大家,当我们定义了一个变量时,会在内存中开辟一段内存用于保存变量内容,开辟多少内存由变量类型来决定。
计算机在访问这块儿内存的时候,会根据内存地址找到初始位置,需要读取多长内存也是由变量类型来决定。
计算机只能识别0或者1,假定,从我们需要的内存地址开始,有一段内存的二进制数据为如下代码时
0000100110011100000000000100100...........
计算机怎么来确定真正需要的值是多少呢?这就是前边说的由变量类型来决定,变量类型说我需要2个字节,就会读取两个字节长度的内容,然后根据变量类型的正负来确定是原码还是补码来表示。接下来就是我们对这段内存变量做处理了,比如我们需要和另一个变量做加法,或者直接打印出来等等。
以上是关于C和C++ 变量内存的主要内容,如果未能解决你的问题,请参考以下文章