【发布时间】:2013-12-22 13:47:59
【问题描述】:
我在 Windows8 上的 Cygwin 上运行了以下程序。
#include<iostream>
#include <stdio.h>
using namespace std;
int main(){
char c1 = 'a';
char c2 = 'b';
int i1 = 1;
float l1 = 100;
float f1 = 3.14;
double d1 = 1.424;
int i2;
char c3;
int i3;
printf("&c1 -> %u\n", (unsigned long)&c1);
printf("&c2 -> %u\n", (unsigned long)&c2);
printf("&i1 -> %u\n", (unsigned long)&i1);
printf("&l1 -> %u\n", (unsigned long)&l1);
printf("&f1 -> %u\n", (unsigned long)&f1);
printf("&d1 -> %u\n", (unsigned long)&d1);
printf("&i2 -> %u\n", (unsigned long)&i2);
printf("&c3 -> %u\n", (unsigned long)&c3);
printf("&i3 -> %u\n", (unsigned long)&i3);
}
我的笔记本电脑给出了以下结果。
$ ./a.exe
&c1 -> 2337487
&c2 -> 2337486
&i1 -> 2337480
&l1 -> 2337476
&f1 -> 2337472
&d1 -> 2337464
&i2 -> 2337460
&c3 -> 2337459
&i3 -> 2337452
我了解每种数据类型都有自己的大小,并根据大小占用内存地址。比如本例中,由于char类型只有1个字节大小,所以变量c1占用了1个内存地址(2337487),而下一个变量c2从地址2337486开始。然而,我很困惑那i1是从2337480开始的。如果c2也是char类型变量,不应该只占用一个地址吗?而i1从2337485开始?
我猜这与编译器有关,但不明白它是如何工作的。有人能给我一些建议吗?
【问题讨论】:
-
编译器更喜欢将变量地址放在内存对齐的地址上,这样可以减少访问或处理某个值的操作。
-
另外,请注意这些实际上是从下往上计算的。所以
c2只是下一个变量c1的一个地址。所以所有的ints 至少距离列表中的下一个变量有四个字节,而chars 是一个字节。我不太记得编译器如何分配内存来知道为什么它们是反向顺序的。 -
它们是堆栈分配的,这就是它们倒数的原因。
-
谢谢大家!我想我现在明白了。
标签: c++