代码优化-内存对齐的123事

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;
}

会发现如果不对齐那么原先只用读一遍的内存会变成读两遍
如果频繁出现,那么内存读取速度会近似下降一半,然而内存占用节省未必提升一倍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值