#pragma pack(n)
重要规则:
1,复杂类型中各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个类型的地址相同;
2,每个成员分别对齐,即每个成员按自己的方式对齐,并最小化长度;规则就是每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数中较小的一个对齐(对于单个char出现时,必须为2的整数倍,比如n=2时,char 占一位,但是后面有一位空;char [2],直接存储,不空位);
3,结构、联合或者类的数据成员,第一个放在偏移为0的地方;以后每个数据成员的对齐,按照#pragma pack指定的数值和这个数据成员自身长度两个中比较小的那个进行;也就是说,当#pragma pack指定的值等于或者超过所有数据成员长度的时候,这个指定值的大小将不产生任何效果;
4,复杂类型(如结构)整体的对齐是按照结构体中长度最大的数据成员和#pragma pack指定值之间较小的那个值进行;这样在成员是复杂类型时,可以最小化长度;
5,结构整体长度的计算必须取所用过的所有对齐参数的整数倍,不够补空字节;也就是取所用过的所有对齐参数中最大的那个值的整数倍,因为对齐参数都是2的n次方;这样在处理数组时可以保证每一项都边界对齐;
#pragma pack(n)
struct node1{
int a;
char b;
short c;
char d;
}test1;
sizeof(test1)
n=1,大小为8, a(4)+b(1)+c(2)+d(1)
n=2,大小为10, a(4)+b(2)+c(2)+d(2)
n=4,大小为12, a(4)+b(2)+c(2)+d(2)
 
struct node2{
int a;
char b;
struct node1 c;
char d;
}test2;
sizeof(test2)
n=1,大小14, a(4)+b(1)+c(8)+d(1)
n=2,大小18, a(4)+b(2)+c(10)+d(2)
n=4,大小24 a(4)+b(2)+c(12)+d(2)
 
struct node3{
int a;
char b[2];
struct node1 c;
}test3;
sizeof(test3)
n=1,大小14, a(4)+b(2)+c(8)
n=2,大小16, a(4)+b(2)+c(10)
n=4,大小20 a(4)+b(2)+c(12)
 
union un1{
char a[5];
int i;
}u1;
sizeof(u1)
n=1,大小5, a(5)
n=2,大小6, a(5)
n=4,大小8 a(5)
 
struct node4{
int a;
char b[3];
union un1 c;
}test4;
sizeof(test4)
n=1,大小12, a(4)+b(3)+c(5)
n=2,大小14, a(4)+b(4)+c(6)
n=4,大小16 a(4)+b(4)+c(8)
#include<iostream>

using namespace std;

#pragma pack(4)

struct node1{
int a;
char b;
short c;
char d;
}test1;
struct node2{
int a;
char b;
struct node1 c;
char d;
}test2;
struct node3{
int a;
char b[];
struct node1 c;
}test3;
union un1{
char a[];
int i;
}u1;
struct node4{
int a;
char b[];
union un1 c;
}test4;
int main()
{
cout << "int " << sizeof(int) << endl;
cout << "short " << sizeof(short) << endl;
cout << "char " << sizeof(char) << endl;
cout << "long " << sizeof(long) << endl;
cout << "double " << sizeof(double) << endl;
cout << "test1 "<<sizeof(test1) << endl;
cout << "test2 " << sizeof(test2) << endl;
cout << "test3 " << sizeof(test3) << endl;
cout << "u1 " << sizeof(u1) << endl;
cout << "test4 " << sizeof(test4) << endl;
system("pause");
return ;
}

#pragma pack(n)的更多相关文章

  1. #pragma pack(push,1)与#pragma pack(1)的区别

    这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n)             作用:C编译器将按照n个字节对 ...

  2. warning malformed '#pragma pack(push[, id], n)' - ignored

    bmp.c:8: warning: malformed '#pragma pack(push[, id], <n>)' - ignored bmp.c:33: warning: #prag ...

  3. 关于pragma pack的用法(一)

    一个很重要的参数#pragma pack(n) 数据边界对齐方式:以如下结构为例: struct {                    char a;                    WOR ...

  4. C语言字节对齐 __align(),__attribute((aligned (n))),#pragma pack(n)

    转载地址 : http://blog.csdn.net/21aspnet/article/details/6729724 一.概念    对齐跟数据在内存中的位置有关.如果一个变量的内存地址正好位于它 ...

  5. C++编译指令#pragma pack的配对使用

    #pragma pack可以用来指定C++数据结构的成员变量的内存对齐数值(可选值为1,2,4,8,16). 本文主要是强调在你的头文件中使用pack指令要配对使用,以避免意外影响项目中其他源文件的结 ...

  6. (转载)关于#pragma pack(push,1)和#pragma pack(1)

    转载http://www.rosoo.net/a/201203/15889.html 一.#pragma pack(push,1)与#pragma pack(1)的区别 这是给编译器用的参数设置,有关 ...

  7. pragma pack(非常有用的字节对齐用法说明)

    强调一点: #pragma pack(4) typedef struct { char buf[3]; word a; }kk; #pragma pack() 对齐的原则是min(sizeof(wor ...

  8. #pragma pack(n) 的作用

    在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int.long.float等)的变量,也可以是一些复合数据类型(如数组.结构.联合等)的数据单元.在结构中,编译器为结构的每个成 ...

  9. #pragma pack(push,1)与#pragma pack(pop)

    这是给编译器用的参数设置,有关结构体字节对齐方式设置, #pragma pack是指定数据在内存中的对齐方式. #pragma pack (n)             作用:C编译器将按照n个字节对 ...

随机推荐

  1. 2-legged oauth & 3-legged oauth

    3-legged oauth resource owner, client, server. resource owner 给client访问权限去访问resource owner在server上的r ...

  2. Unity3D实现摄像机视野的拉远拉近和跟随主角旋转效果

    在Unity官网教程SurvivalShooter(恶魔射手)中,只处理了主角跟随鼠标旋转,摄像机视野并没有旋转或通过滚轮实现视野的拉远拉近,一下是我的实现方法.   在教程中,主角的移动是通过    ...

  3. codeforces 682D(DP)

    题目链接:http://codeforces.com/contest/682/problem/D 思路:dp[i][j][l][0]表示a串前i和b串前j利用a[i] == b[j]所得到的最长子序列 ...

  4. IndexOf("authentication failed") > -1

    if (e.Value.Error.Message.IndexOf("authentication failed") > -1)   {      strFailMessag ...

  5. Xcode与OX 版本对照表

    xcode1.0-xcode2.x 版本 OS X运行版本 OS X SDK(s) 1.0 OS X Panther(10.3.x) OS X Puma(10.1.x),OS X Jaguar(10. ...

  6. *** glibc detected *** malloc(): memory corruption 分类: C/C++ Linux 2015-05-14 09:22 37人阅读 评论(0) 收藏

    *** glibc detected *** malloc(): memory corruption: 0x09eab988 *** 发现是由于memset越界写引起的. 在Linux Server上 ...

  7. MongoDB学习笔记四:索引

    索引就是用来加速查询的.创建数据库索引就像确定如何组织书的索引一样.但是你的优势是知道今后做何种查询,以及哪些内容需要快速查找.比如:所有的查询都包括"date"键,那么很可能(至 ...

  8. valgind使用错误——检测不同位目标程序

    当64位的valgrind工具测试32位的程序时,会报如下错误: ==22235== Memcheck, a memory error detector ==22235== Copyright (C) ...

  9. Restful 支持 自定义序列化

    [ServiceContract] [ServiceKnownType(typeof(HRAwardObject))] [ServiceKnownType(typeof(WorkflowBasicIn ...

  10. 【其它】 MathJax - 网页中显示数学公式的终极武器

    最近在学习一些数学课程.但时间一长,发现很多东西又都忘了.而且过程中的很多心得没有留下记录,觉得挺可惜的.所以决定开个博客来记录一些东西,也希望能同数学爱好者们一起学习. 但写数学博客首先得解决显示数 ...