我是靠谱客的博主 体贴睫毛膏,最近开发中收集的这篇文章主要介绍C语言 字节对齐#pragma pack(k) 改变字节对齐大小,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

思考:为什么要字节对齐? 内存对齐的一些原则?

原文作者:andy572633
原文地址:http://blog.csdn.net/andy572633/article/details/7213465


空间换时间

结构体内成员按自身长度自对齐

#### 结构体的总大小为结构体的有效对齐值的整数倍

结构体的有效对齐值的确定(会有编译器优化问题):

1)当未明确指定时,以结构体中最长的成员的长度为其有效值

2)当用#pragma pack(n)指定时,以n和结构体中最长的成员的长度中较小者为其值。

3)当用attribute ((packed))指定长度时,强制按照此值为结构体的有效对齐值


结构体对齐的一些题目

32位机器上定义如下结构体

struct xx
{
    long long _x1;
    char _x2;
    int _x3;
    char _x4[2];
    static int _x5;
};
int xx::_x5;

sizeof(xx) = 24;
首先静态变量不用管,按最长8个字节对齐, 其中 _x2 _x3 一起占8个字节,_x2扩展后占4个字节,char _x4[2]直接扩展占8个字节

如下的结构

struct xx
{
    long long _x1;
    char _x2;
    int _x3;
    char _x4[2];
    int xt;
    static int _x5;
};
int xx::_x5;

sizeof(xx) = 24


struct st
{
    char ch, *ptr;
    union
    {
        short a, b;
        unsigned int c : 2, d : 1;

    };
    bool f;
    struct st *next;
};

sizeof(st) = 20
//ch 1(对齐4)
//ptr 4
//union 4 这里和unsigned intc : 2 , d : 1; 位域 c占两个2 然后紧接着存d 占1 然后对齐 是4
//bool 1(对齐 4)
//next 4


  • 结构体(struct)中所有变量是“共存”的——优点是“有容乃大”,全面;缺点是struct内存空间的分配是粗放的,不管用不用,全分配。

  • 联合体(union)中是各变量是“互斥”的——缺点就是不够“包容”;但优点是内存使用更为精细灵活,也节省了内存空间。

union example 1

这里写图片描述

union example 2

这里写图片描述

#pragma pack(k) 改变字节对齐大小

这里写图片描述

解析参考
作者:chengonghao
地址:http://blog.csdn.net/chengonghao/article/details/52160632

最后

以上就是体贴睫毛膏为你收集整理的C语言 字节对齐#pragma pack(k) 改变字节对齐大小的全部内容,希望文章能够帮你解决C语言 字节对齐#pragma pack(k) 改变字节对齐大小所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(29)

评论列表共有 0 条评论

立即
投稿
返回
顶部