#pragma pack与sizeof union
一道题
- #pragma pack(2)
- class A
- {
- int i;
- union U
- {
- char buff[13];
- int i;
- }u;
- void foo() { }
- typedefchar* (*f)(void*);
- enum{red, green, blue} color;
- }a;
sizeof(a)的值是()
A、20 B、21 C、22 D、24 E、非以上选项
(第一个i 4,union 一共14 enum 4,其他不占。
union 详解
union A
{
int a[5];
char b;
double c;
};
struct B
{
int n;
A a;
char c[10];
}
sizeof(B) = ?
答案:
union A:
{
int a[5]; //20
char b; //1
double c; //8
}
我想的是union中变量共用内存,应以最长的为准,那就是20。可实际不然,sizeof(A)=24,
A中各变量的默认内存对齐方式,必须以最长的double 8字节对齐,故应该是sizeof(A)=24。
struct B
{
int n; // 4字节
A a; // 24字节
char c[10]; // 10字节
};
实际占用38字节,但由于A是8字节对齐的,所以int n和char c[10]也需要8字节对齐,总共8+24+16=48
内存对齐主要目的是提升读取数据的速度,通过保证 类型数据(n字节)保存在n倍数的内存
地址上。(n越大,要求越严格。)
要做到这点,有3个位置要求。
首地址,调到最严格地址倍数上,不影响大小。
中间项,按各自下一项的地址要求填充调整,影响大小。
最后一项,通过填充,达到最严格地址大小倍数,影响大小。
union A
{
int a[5];
char b;
double c;
};
对于union A(共享内存),其实只有一项
至少需要20字节。首地址可以解释为3种类型,
A =a时,
| 4 | 4 | 4 | 4 | 4 | ,20字节
中间和尾部都不需调整。
A =b时,
|1|.................|,
中间和尾部都不需调整,20字节。
A =c时,
| 8 |...........|,
c作为最后项,需要调整20-〉24
因此,内存布局:
| 4 | 4 | 4 | 4 | 4 |...| (...为padding),total=24
struct B
{
int n;
A a;
char c[10];
};
这里要注意a,是作为A类型,是一项数据。
对于 struct B,最严格8字节,
首地址为8的倍数,填入n,(后面空4个字节,因为a的开始地址要求8的倍数)
c,开始地址无特殊要求,a后面无需填充,
作为尾项,c,10-〉16
| 4 |...| 4 | 4 | 4 | 4 | 4 |...|10->16|
to kimiya25:
struct C{
int n;
char c[10];
union {
int a[5];
char b;
double c;
} u_a;
};
n: 4
c: 10->12
u_a: 24
| 4 | 10 |...| 24 |
//----------------------------------
效率的解释:例处理器每次从内存读入8个字节的数据,当我们需要一个double类型的数据
时,通过在写入内存时改保证数据写在8倍数的地址上,就能够只用一次读,否则可能跨越
pragma pack详解
对齐方式
对齐用法详解
转载于:https://www.cnblogs.com/cavehubiao/p/3310926.html
#pragma pack与sizeof union相关推荐
- 快速理解内存对齐以及#pragma pack
一.内存对齐目的与原理 1.内存对齐的目的 假如没有内存对齐机制,数据可以任意存放,现在一个int变量存放在从地址1开始的联系四个字节地址中,该处理器去取数据时,要先从0地址开始读取第一个4字节块,剔 ...
- #pragma pack(n)和sizeof求结构的大小
为了提高CPU的存储速度,VC对一些变量的起始地址做了"对齐"处理.在默认情况下,VC规定各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数 ...
- #pragma pack(1)的作用
#pragma pack(n) 解释一: 每个特定平台上的编译器都有自己的默认"对齐系数"(也叫对齐模数).程序员可以通过预编译命令#pragma pack(n),n=1,2,4, ...
- #Pragma Pack(n)与内存分配 pragma pack(push,1)与#pragma pack(1)的区别
from:http://blog.csdn.net/mylinx/article/details/7007309 #pragma pack(n) 解释一: 每个特定平台上的编译器都有自己的默认&quo ...
- 【C++ Primer】 神秘的 sizeof(union) 、sizeof(struct) 和内存对齐技术
一,union:C/C++关键字 共用体(联合) 共用体的声明和共用体变量定义与结构十分相似.形式为: union 共用体名 { 数据类型 成员名; 数据类型 成员名; ... } 变量名; 共用体 ...
- #Pragma Pack(n)与内存分配 pragma pack(push,1)与#pragma pack(1)的区别
#pragma pack(n) 解释一: 每个特定平台上的编译器都有自己的默认"对齐系数"(也叫对齐模数).程序员可以通过预编译命令#pragma pack(n),n=1,2,4, ...
- Linux C/C++编程——常用关键字pragma pack和attribute_packed总结
(一)pragma pack使用说明 用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题,有时候为了内存对齐需要补齐空字节.通常写 ...
- #pragma pack(n) 的作用
在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int.long.float等)的变量,也可以是一些复合数据类型(如数组.结构.联合等)的数据单元.在结构中,编译器为结构的每个成 ...
- #pragma pack 内存对齐
1. 用法 #pragma pack是C/C++里面设置字节对齐方式的预编译函数 2. 解释 先看下面代码: #include <iostream> using namespace std ...
- #pragma pack的作用
#pragma pack 当#pragma pack指定的值等于或者超过所有数据成员长度的时候,这个指定值的大小将不产生任何效果: 一句话: 如果是1的话表示紧凑存放,除了char,bool,每个都要 ...
最新文章
- Set Matrix Zeroes leetcode
- mysql外连接插座_深入理解SQL的四种连接-左外连接、右外连接、内连接、全连接...
- VTP (vlan trunking protocol)
- [Java]关于throw,throws,try{}catch(){}
- java会编译失败吗?_Java为什么会有“无法到达的语句”编译器错误?
- IIS优化-解决IIS访问速度慢问题
- java中的四个指令_JAVA命令学习系列(四) ---- jstat
- sql date 函数_什么是SQL DATE()函数?
- java常见面试题:Java程序员面试题(四)
- Linux之flash流媒体服务器red5安装
- 2021年7月最新iOS面试题总结(答案篇)
- 名编辑电子杂志大师教程 | 怎样给电子画册设置目录?
- 安卓手机如何直接跟Mac电脑互传文件
- 批量打印电子发票方法,发票连续打印教程分享
- wps linux 程序转pdf文件,wps转pdf服务器
- 微信小程序开发工具模拟器不显示鼠标问题【推荐两方案】
- 计算机的算数运算符号位参与计算吗,C语言算术运算符和算术表达式
- 机器视觉工业相机选型
- 3阶以下贝塞尔曲线轨迹库和任意轨迹库
- [Zotero] 解决ubuntu中zotero:// 链接跳转无法工作的问题