1、内存分析(以结构体举例)?
一个结构体定义如下:
//1Byte = 8bit
struct S{
int8 a;//1 int8 = 1Byte
int32 b;//1 int32 = 4Byte
}
实例化一个S,占用8Byte(大部分编译器下),而不是5Byte
内存地址排列示意图如下
2、为什么编译器要这样内存对齐?
1)有的系统不支持一些特殊的变量类型
不支持int8但支持int32,那么就得用int32去存储int8
2)索引指针无需变动,内存获取速度更快
实际读取时内存单元是每n个一组,一次读一组,比方说此时n=4
如果不对齐,int8和int32紧密相连,那么读取int32就要索引两次!
3、对象占用内存与内存对齐的关系?
没有关系
对象占用内存的大小与类型本身定义有关,内存对齐只是一种编译器实现和优化方式
4、内存对齐对程序性能的影响?
#include <iostream>
#include <stdint.h>
#include <stdlib.h>
#include <memory>
struct A
{
A():a(0),b(0),c(0),d(0){}
int64_t a;
int64_t b;
int64_t c;
int64_t d;
};
int main()
{
char* buffer = (char*)malloc(32);
A* a = new(buffer)A;
asm volatile("": :"r,m"(a): "memory");//告诉编译器不要优化a
free(buffer);
return 0;
}
会发现如果不对齐那么原先只用读一遍的内存会变成读两遍
如果频繁出现,那么内存读取速度会近似下降一半,然而内存占用节省未必提升一倍