C和C++ 变量内存

2019-08-16 07:42:44来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

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个字节,就会读取两个字节长度的内容,然后根据变量类型的正负来确定是原码还是补码来表示。接下来就是我们对这段内存变量做处理了,比如我们需要和另一个变量做加法,或者直接打印出来等等。

 


原文链接:https://www.cnblogs.com/kylinhu/p/11096414.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:递归(二):正整数的拆分

下一篇:超级简单的跨平台高性能音视频播放框架QtAv编译指南