#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. Cache-control使用Cache-control:private学习笔记

    其作用根据不同的重新浏览方式,分为以下几种情况:(1).打开新窗口值为private.no-cache.must-revalidate,那么打开新窗口访问时都会重新访问服务器.而如果指定了max-ag ...

  2. Hadoop学习资料

    转自:http://cloud21.iteye.com/blog/607175 第一手资源 hadoop官方网站 hadoop.apache.org 最权威的官方资源之一 dev.yahoo.hado ...

  3. Java中的泛型

    1:泛型(掌握) (1)泛型概述 是一种把明确类型的工作推迟到创建对象或者调用方法的时候才去明确的特殊的类型. (2)格式: <数据类型> 注意:该数据类型只能是引用类型. (3)好处: ...

  4. 如何解决xx列不在表中

    在连接数据库的程序中常会出现xx列不在表中的问题?那么应该怎么解决呢? 产生此问题的原因有三种: 1.数据表没这个字段2.sql查询没将这个字段查出来3.字段名写错了 还有重要的是一定要检查你的数据库 ...

  5. 2016 - 1 - 23 json解析

    一: json   1. 什么是json 1.1 json是一种轻量级的数据格式,一般用于数据交互. 1.2 服务器返回给客户端的数据,一般都是JSON或者XML格式(文件下载除外).   2. JS ...

  6. Android 布局优化

    转载自stormzhang的博客:http://stormzhang.com/android/2014/04/10/android-optimize-layout/ < include /> ...

  7. Android 学习第2课,下载 eclipse 工具

    可以到http://www.ddooo.com/softdown/61745.htm 下载下来是32位与64位都有的 而且是汉化的,经测试成功,还可以,不错!

  8. java取整和java四舍五入方法 转自董俊杰

    import java.math.BigDecimal; import java.text.DecimalFormat; public class TestGetInt{ public static ...

  9. 准确理解SO_REUSEADDR

          默认情况下,套接字不同一个正在使用的本地地址绑定到一起.但在少数情况下,仍有必要以这种方式,来实现对一个地址的重复利用.每个连接都是通过它的本地及远程地址的组合,"独一无二&qu ...

  10. python3_phantomJS_test

    phantomJS和selenium差不多,几乎不相上下,使用会麻烦一点,但是比selenium快很多: # !/usr/bin/python3.4 # -*- coding: utf-8 -*- f ...