直入主题,怎么判断内存对齐规则,sizeof的结果怎么来的,请牢记以下3条原则:(在没有#pragma pack宏的情况下)

1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。

2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)

3:收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐.

等你看完此3条原则,2分钟已经过去,抓紧时间,实战3分钟:

typedef struct bb
{
 int id;             //[0]....[3]
 double weight;      //[8].....[15]      原则1
 float height;      //[16]..[19],总长要为8的整数倍,补齐[20]...[23]     原则3
}BB;

typedef struct aa
{
 char name[2];     //[0],[1]
 int  id;         //[4]...[7]          原则1

double score;     //[8]....[15]    
 short grade;    //[16],[17]        
 BB b;             //[24]......[47]          原则2
}AA;

int main()
{
  AA a;
  cout<<sizeof(a)<<" "<<sizeof(BB)<<endl;
  return 0;
}

结果是

48 24
ok,上面的全看明白了,内存对齐基本过关.

再讲讲#pragma pack().

在代码前加一句#pragma pack(1),你会很高兴的发现,上面的代码输出为

32 16
bb是4+8+4=16,aa是2+4+8+2+16=32;

这不是理想中的没有内存对齐的世界吗.没错,#pragma pack(1),告诉编译器,所有的对齐都按照1的整数倍对齐,换句话说就是没有对齐规则.

明白了不?

那#pragma pack(2)的结果又是多少呢?对不起,5分钟到了,自己去测试吧.

参考资料:http://blog.csdn.net/rj03hou/article/details/4517035

转载于:https://www.cnblogs.com/dingxiaoqiang/p/8059329.html

c/c++ struct的大小以及sizeof用法相关推荐

  1. sizeof 头文件_c/c++基础之sizeof用法

    在 C/C++ 中,sizeof() 是一个判断数据类型或者表达式长度的运算符. 1 sizeof 定义 sizeof 是 C/C++ 中的一个操作符(operator),返回一个对象或者类型所占的内 ...

  2. c char转int_c/c++基础之sizeof用法

    在 C/C++ 中,sizeof() 是一个判断数据类型或者表达式长度的运算符. 1 sizeof 定义 sizeof 是 C/C++ 中的一个操作符(operator),返回一个对象或者类型所占的内 ...

  3. C语言中sizeof用法

     sizeof()简单介绍 (一)基本概念 sizeof操作符以字节形式给出了其操作数的存储大小.操作数可以是一个表达式或括在括号内的类型名.操作数的存储大小由操作数的类型决定. (二)使用方法 1. ...

  4. sizeof用法汇总

    sizeof用法 一.sizeof的概念 sizeof是C语言的一种单目操作符,尤其注意的是,它不是一个函数.sizeof接收一个操作数,操作数可以是一个表达式或者是括在括号内的数据类型名.sizeo ...

  5. sizeof用法详解

    一.sizeof是什么 sizeof是C语言的一种单目操作符,如C语言的其他操作符++.–等.它并不是函数.sizeof操作符以字节形式给出了其操作数的存储大小.操作数可以是一个表达式或括在括号内的类 ...

  6. C++ sizeof用法

    sizeof操作符的作用是返回一个对象或类型名的长度,长度的单位是字节. 返回值的类型是标准库命名为size_t的类型,size_t类型定义在cstddef头文件中,该头文件是C标准库的头文件stdd ...

  7. C# 获取对象 大小 Marshal.SizeOf (sizeof 只能在不安全的上下文中使用)

    C# 能否获取一个对象所占内存的大小? 今日,在项目重构的时候忽然想到一个问题,一个类哪些成员的增加,会影响一个类所占内存的大小?C#有没有办法知道一个对象占多少内存呢? 第一个问题:很快想到是类的非 ...

  8. 关于C语言——结构体struct的大小是如何计算的

    C语言中的内存是比较复杂的,能够认识了解内存,对学习C语言能有莫大的帮助! 关于结构体的大小有如下规律: 1.结构体的大小是由n个"结构体中最大的那个类型"的大小模块组成(n< ...

  9. C语言如何获取结构体中指定元素的大小?sizeof ( (X*)0 ) -> Y)(空指针操作)

    获取结构体的大小,这好办,这样就可以了: #include <stdio.h>struct user {char name[20];char age[10]; };int main() { ...

最新文章

  1. 做个游戏:设计代码生成特定的调用堆栈
  2. Linux通过端口查找tomcat的路径
  3. iOS项目中的网络请求和上下拉刷新封装
  4. html 的css骚操作,意想不到的 CSS 伪元素 before/after 各种骚操作 - 文章教程
  5. 计算机本地磁盘加密,我可以将onedrive本地文件夹转移到BitLocker加密文件夹吗?...
  6. 大陆集团:放弃内燃机,适用于高阶自动驾驶MK C1制动系统2020年国内投产
  7. Java 多线程 之 wait等待 线程实例
  8. 【机器人】9-10月项目疑惑
  9. 牛客高级项目课(仿牛客网)笔记
  10. 为什么计算机专业英语很重要,英语对计算机专业的重要性及如何提高英语水平...
  11. js月份的计算公式_js判断某年某月有多少天(闰年计算方法)
  12. 符号_网名特殊符号在线制作
  13. 电脑键盘equals在哪个位置_常用标点符号和电脑键盘符号英语表示 -
  14. 中国信通院副院长王志勤:加快5G新基建,驱动数字化转型升级 (视频+全文+PPT)...
  15. 第四章 MPT 现代组合理论
  16. [易飞]如何制作自定义报表
  17. VC2005 如何获取系统时间
  18. 幼教艺术活动设计《美丽的雪花》
  19. python如何实现手眼定标_相机标定(一):机器人手眼标定
  20. 企培版开发功能 中电集控操作说明

热门文章

  1. element-ui中用el-dialog+el-table+el-pagination实现文件默认选中且在分页的条件下有记忆功能...
  2. 【PyCharm疑问】在pycharm中带有中文时,有时会导致程序判断错误,是何原因?...
  3. Window右键添加“用vim打开”
  4. 技术帖:砖混、砖木、钢混、板楼、塔楼、框架、框架剪力墙等概念之区别优劣...
  5. 0726------Linux基础----------线程池
  6. openfire推送离线聊天信息的插件
  7. ime-mode:disabled 禁止表单使用文本框输入法
  8. 查看命令为内置命令还是外部命令
  9. 26.Silverlight多线程技术ThreadPool的使用
  10. 线程入门-使用Thread类