再探结构体字节对齐问题
主要参考这篇博文,总结成下面几点:
1. 根据操作系统及编译器不同有不同的对齐方式,代码中C的大小在mac下是16,在windows下是24;
2. 除了int a:2这种类型的变量,其他变量存放的起始位置都是该变量的整数倍,包括该结构题的初始化内存地址;
3. 由于上面这条规则,因此struct的大小是内部最大变量的整数倍;
4. struct的嵌套可能被编译器优化成在一个struct中的情况;
5. C和D的大小不一样,所以当int a:2以及int b:2这种相同类型的放在一起,可能直接被编译器优化成了int _a_b:4。
#include <cstdio>struct B {char a[3]; };struct A { /*int a;//int b:20;//int c:5; double d;*/B e;char b; };struct C {int i:8;char j:4;int a:4;double b; }; struct D { int i:8; int a:4; char j:4; double b;};int main() { /*A *a = new A();unsigned long int add = (unsigned long int)a;int size = (int)sizeof(A);if (add % size == 0) {printf("yes\n");} else {printf("no\n");}*/ // printf("%d %d\n", (int)sizeof(A), (int)sizeof(B));printf("%d\n", (int)sizeof(C)); }
转载于:https://www.cnblogs.com/litstrong/p/3303453.html
再探结构体字节对齐问题相关推荐
- 结构体字节对齐(转)
结构体字节对齐 在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题.从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是 ...
- 一文了解结构体字节对齐
结构体字节对齐详解 表述如有不正确的地方,欢迎批评指正. C++/C 常见的基本数据类型: bool short (short int) int long (long int) long long ( ...
- mysql字节对齐_结构体字节对齐(转)
结构体字节对齐 在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题.从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是 ...
- C语言结构体字节对齐
默认字节对齐 C语言结构体字节对齐是老生常谈的问题了,也是高频面试题,现在我们来深入研究这个问题,彻底弄懂到底是怎么回事,给你一个结构体定义和平台机器位数就能手动计算出结构体占用字节数,现在我们不 ...
- 指定结构体字节对齐方式
指定结构体字节对齐方式 #pragma pack(push,1) typedef struct { int b; char a; }struct_t1; #pragma pack(pop)
- C语言结构体字节对齐规则
C语言结构体字节对齐规则 基本规则 规则1 :结构体(struct)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存放在offset为该数据成员大小的整数倍的地方(比如int在 ...
- 结构体字节对齐详解【含实例】
一.前言 结构体字节对齐属于老生常谈的问题,看似简单,却很容易忘记.而且因为结构体使用的普遍性,使得字节对齐也成为了一个不得不谈的话题. 二.什么是结构体字节对齐 假设现在有一个结构体如下,问你它的一 ...
- c/c++下取消结构体字节对齐方法
c/c++下取消结构体字节对齐方法 在c/c++下编译器会默认地对结构体进行对齐,其对齐的方法跟平台具体的特性有关,本文主要介绍结构体不进行对齐的方法. 1.结构体字节不进行对齐的用途 (1).减小内 ...
- typedef __packed struct (结构体字节对齐)(转)
结构体字节对齐 在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题.从理论上讲,对于任何 变量的访问都可以从任何地址开始访问,但 ...
- mysql字节对齐_结构体字节对齐-位域及其对齐
字节对齐的准则:其实字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则: 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除: 2) 结构体每个成员相对于结构体首地址的偏移量都是成 ...
最新文章
- mysql的默认sid_默认实例(SID)已经设置,空实例默认连接时却连接不上?
- 015 Android之可执行文件dex
- 【QGIS入门实战精品教程】5.1:QGIS地理坐标转火星坐标系(GCJ02)案例教程
- 如何查看mysql的gtid_汇总丨MySQL GTID技术点,看这一篇就够了!
- linux 源码安装mysql5.7_linux安装mysql5.7.27
- linux multipath.log,Linux Multipath配置
- php字符型和数字型的注入,Sql注入的分类:数字型+字符型
- 银行招聘考试题库计算机,2019银行招聘计算机试题(一)答案
- 华为云 git 托管代码 教程
- 【云服务器】阿里云服务器+宝塔Linux零成本搭建全网音乐搜索引擎网站(在线音乐播放器),可在线播放可下载可分享它不香么?
- python处理excel文件合并问题
- 优动漫PAINT入门宝典(图层篇)——矢量图层
- 【大前端】用html和css写一个QQ邮箱登录页面
- Android面试题之Activity篇
- 双鱼直播动态调试 .so文件输出密匙
- 我分析了上万个微信红包数据,得到了这些发现(附数据集)
- socket学习二、accept、read、write函数详解
- java 排序库_Java数据库排序
- OnCreate()与PreCreateWindow()
- 做的最简单的APP-计数器
热门文章
- 20145321 《信息安全系统设计基础》第5周学习总结
- grub引导U盘(集成常用工具/深山红叶PE工具箱V30/完美者U盘维护系统V8.1)
- SQL server2005安装问题
- .NET技术(Path)
- 自定义基于HTML5的video播放器—Customize your video player
- postman 的基础使用
- centos下配置LNMP环境(源码安装)
- 《Microduino实战》——2.2 兼容Arduino系列产品
- Mac Pro 使用 ll、la、l等ls的别名命令
- 我的vs2010扩展备忘.jpg