内存地址
一个内存地址可存储 8 bit = 1 byte(字节)
32位操作系统可寻址空间为 2^32 (Byte) = 2^10 * 2^10 * 2^10 *4 = 4 GB
数据所占内存大小
C声明 | 字节数 | 字节数 |
---|---|---|
有符号 | 32位 | 64位 |
char | 1 | 1 |
short | 2 | 2 |
int | 4 | 4 |
long | 4 | 8 |
char* | 4 | 8 |
float | 4 | 4 |
double | 8 | 8 |
大端小端
32bit宽的16进制 0x12345678 在内存中的存放方式:
大端: 高字节存储在低地址,低字节存储在高地址
内存地址 | 0x4000 | 0x4001 | 0x4002 | 0x4003 |
---|---|---|---|---|
存放内容 | 0x12 | 0x34 | 0x56 | 0x78 |
小端: 低字节存储在低地址,高字节存储在高地址
内存地址 | 0x4000 | 0x4001 | 0x4002 | 0x4003 |
---|---|---|---|---|
存放内容 | 0x78 | 0x56 | 0x34 | 0x12 |
union 共用体
任何时刻共用体中只存放了一个被选中的成员
所有成员都从低地址开始存放
结构体和共用体的区别在于:
结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。
判断大端小端
#define BIG_ENDIAN 0
#define LITTLE_ENDIAN 1
int TestByteOrder(){
short int word = 0x0001;
char* byte = (char*) &word;//自地址总是指向低地址,&word 即为字地址
return (byte[0] ? LITTLE_ENDIAN : BIG_ENDIAN );
}
#include <iostream>
using namespace std;
union TEST{
short a;
char b[sizeof(short)];
};
int maint(){
TEST test;
test.a = 0x0102;
if(test.b[0] == 0x01 && test.b[1] == 0x02){
cout << "big endian."<< endl;
}
else if(test.b[0] == 0x02 && test.b[1] == 0x01){
cout << "little endian" << endl;
}
else{
cout << "unknown" << endl;
}
return 0;
}
栈地址生产方式:从高地址到低地址
- 先分配的变量存在高地址,后分配的存在低地址
- 栈空间由编译器开辟和释放,主要存放局部变量和函数参数