c++基础内存概念

计算机以比特序列存储数据,每个比特(bit)非0即1:

01001110

c++ primer: 大多数计算机以2的整数次幂个比特作为块来处理内存,可寻址的最小内存块成为“字节”(byte),一个字节有8比特构成。计算机中将内存中每个字节和一个数字(称为地址,address)关联。

1 byte = 8 bit

1 K = 1024 byte

1 M = 1024 K

1 G = 1024 M

1 kB = 1000 byte

8bit的数可以表示0~255中间的数(最大1111 1111). 

比如一个int占有4个字节

sizeof(int)  // 4字节, -2147483648 到 2147483647
sizeof(int8_t)   // 1
sizeof(int16_t)  // 2
sizeof(int64_t)  // 8
sizeof(float)  // 4
sizeof(long)  // 8
sizeof(long int)  // 8
sizeof(short)  // 2字节, 范围 -32768 到 32767
sizeof(char)  // 1

// long int和long long int就是int64_t, long是之前c的语法,在c++中用int64_t代替

将内存空间地址从高地址位到低地址位分为:                                                                                                               

(系统内核)、栈区、自由存储区、堆区、常量存储区、全局区(变量存储区)。   

1. 栈区(stack)

    栈是由编译器自动分配和释放,主要是存放参数值、局部变量值等。栈区的地址分配由高位向低位区扩展(向自由存储区扩展)。指针分配的是栈地址。

2. 自由存储区

  由malloc创建的空间。需要用free来释放空间。

3. 堆区(heap)

  堆区的内存是通过程序员进行分配和释放的,比如new分配的内存块。需要用delete释放。堆区申请的地址从低位开始向高位扩展(向自由存储区扩展)。堆区的地址一般是不连续的的内存空间。堆都是动态分配的。

4. 常量存储区(static)

   存储定义的常量,数字字符等。常量区定义好之后不能被修改。static variable is basically a global variable. 比如被static修饰的类型都会在这,且都会分配一个address,这个address是固定不变的。

5. 变量存储区(静态存储区)

  存储全局变量和局部变量。

int main() {
  int *ptr; // 栈
  char a[] = "Hello World";  // a在栈上,"Hello World"在常量区上;
}

有符号数表示范围

## int8有符号数表示范围为-128~127
# 最大值为+127
0111 1111  = 0*2^7 + 1*2^6 + 1*2^5 + .. + 1*2^0=127

# 最小值为-128
1000 0000  = 1*2^7 + 0 = 128

查看计算机memory

cat /proc/meminfo | grep Mem
MemTotal:       528024840 kB
MemFree:        402888164 kB

# 其中MemTotal即机器的内存大小,大小kB。换算为G:
528024840 * 1000 / 1024 / 1024 / 1024 = 491 G

computer memory: In computing, memory is a device or system that is used to store information for immediate use in a computer or related computer hardware and digital electronic devices. The term memory is often synonymous with the term primary storage or main memory. An archaic synonym for memory is store.(from wikipedia)

查看计算机磁盘空间

df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay         3.5T  2.9T  367G  89% /    # home目录
...

数据对齐

由于硬件影响,CPU读取地址是从特性的对齐地址开始读取的。比如32位系统以8字节为对齐边界,64位系统以16字节为对齐边界。以64位系统为例子,CPU读取的时候会从16字节倍数处的地址开始往后依次读取。所有为了加速访问效率,最好在申请内存的时候从对齐边界处开始申请内存,否则CPU会先访问一些无效的地址,然后依次往后把有效地址数据读取拼接出来。

自然对齐: the compiler assigns addresses that are multiples of the size in bytes of the data type. 即数据结构的地址是其大小的倍数称为自然对齐。很多数据结构申请后都是自然对齐的,比如struct:

struct struct_ {
  double a;  // 8 字节
  int b;   // 4字节
  char c;  // 1字节
}

// sizeof(struct_) 16字节
// ptr for struct_ : 0x55deda36e280
// ptr for a in struct_ : 0x55deda36e280
// ptr for b in struct_ : 0x55deda36e288

struct的地址指针和其第一个成员地址是一样的,这里都是0x55deda36e280, 且由于是64位系统,这里的指针也是16的整数倍,这样CPU访问struct的时候就刚好在对齐边界,可以加速访问。整个结构体的大小是其最大成员double大小的整数倍(具体几倍要看多少可以把所有的成员都放下),这里就体现了自然对齐。struct为了访问的快速会多申请一些内存。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值