VC++平台上的内存对齐操作

我们知道当内存的边界正好对齐在相应机器字长边界上时,CPU的执行效率最高,为了保证效率,在VC++平台上内存对齐都是默认打开的,在32位机器上内存对齐的边界为4字节;比如看如下的代码:

struct MyStruct
{
    int i;
    char c;
};
int _tmain(int argc, _TCHAR* argv[])
{
    cout<<sizeof(MyStruct)<<endl;
    return 0;
}

此时输出的结果并不是sizeof(int) + sizeof(char) = 5而是8,因为内存对齐的原因,将char分配为4个字节效率更高;

在VC平台上我们可以通过预处理指令:#pragma pack(show)来查看当前内存对齐的方式,我们在代码前加上一句#pragma pack(show),再次编译,在编译器的“生成”窗口中看到一个警告:“warning C4810: 杂注 pack(show) 的值 == 8”说明这时编译器采用的是8字节的对齐方式,另外可以通过这个预处理指令更改对齐方式,比如将代码改写一下:

#pragma pack(show)
#pragma pack(1)

struct MyStruct
{
    int i;
    char c;
};
int _tmain(int argc, _TCHAR* argv[])
{
    cout<<sizeof(MyStruct)<<endl;
    system("PAUSE");
    return 0;
}

这个时候得到结果为5,也就是说我们已经将对齐方式改为了1; 除了这个预处理指令我们也可以通过VC++扩展关键字align来改变内存的对齐方式:

#pragma pack(show)
#pragma pack(1)

struct MyStruct
{
    int i;
    char c;
};

struct __declspec(align(1)) MyStruct1
{
    int i;
    char c;
};

int _tmain(int argc, _TCHAR* argv[])
{
    cout<<sizeof(MyStruct)<<endl;
    cout<<sizeof(MyStruct1)<<endl;
    system("PAUSE");
    return 0;
}

这个时候输出的结果为两个5;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏SpringBoot

Jquery 常见案例

版权声明:本文为博主原创文章,未经博主允许不得转载。

19810
来自专栏圣杰的专栏

ABP入门系列(14)——应用BootstrapTable表格插件

源码路径:Github-LearningMpaAbp 1. 引言 之前的文章ABP入门系列(7)——分页实现讲解了如何进行分页展示,但其分页展示仅适用于前台we...

81450
来自专栏九彩拼盘的叨叨叨

学习纲要:异步流程处理

修改上面的代码,用 Promise,async/await,事件发布订阅 这几种方式实现下面的需求

9720
来自专栏vue学习

24、商品列表页之数据渲染和传值

(1)data中定义一个list对象 (2)将res.data.goodslist赋值给list (3)我们将商品图片、文字描述、价格、折扣等等信息传给子组...

15810
来自专栏逸鹏说道

Jupyter ~ 像写文章般的 Coding

这次选Markdown模式(关于Markdown基础可以看之前写的Markdown Base)

13230
来自专栏移动开发之家

Flutter完整开发实战详解(二、 快速开发实战篇)

 作为系列文章的第二篇,继《Flutter完整开发实战详解(一、Dart语言和Flutter基础)》之后,本篇将为你着重展示:如何搭建一个通用的Flutter ...

1.7K10
来自专栏偏前端工程师的驿站

JS魔法堂:获取当前脚本文件的绝对路径

一、前言                           当写模块加载器时,获取当前脚本文件的绝对路径作为基础路径是必不可少的一步,下面我们一起来探讨一下这...

33660
来自专栏Golang语言社区

Golang语言社区--golang 进度下载文件

大家好,我是Golang社区主编彬哥,本篇给大家转载一篇关于文件下载相关的文章。

51460
来自专栏React

React和Redux——状态管理Flux和Redux

在强调组件化的React中,我们需要以高内聚、低耦合的原则设计高可复用性的组件。因此渲染组件的数据由两部分组成,一个是由父组件传入的Props参数、一个是组件的...

28870
来自专栏宏伦工作室

解放你的双手,陪爸妈看春晚去!

21520

扫码关注云+社区

领取腾讯云代金券