关闭

struct中的字节对齐问题

标签: 字节对齐
732人阅读 评论(0) 收藏 举报
分类:

原因:CPU为了快速的存取内存从而存在内存问题


分析方法:

  • 有例子1
#include <stdio.h>
struct A{
    char a2; // 占一字节
    char a3;
    char a;
    short i; // 占两字节
};
int main(int argc, const char *argv[])
{
    struct A aa = {0x1, 0x2, 0x3, 0x5555};
    char *p = &aa;
    int i;

    printf("sizeof(struct A) = %d\n", sizeof(aa));
    for (i = 0; i < sizeof(aa); i++)
    {
        printf("%#x ", *p);
        p++;
    }
    putchar(10);

    return 0;
}

执行结果是:

sizeof(struct A) = 6
0x1 0x2 0x3 0 0x55 0x55

  • 例子2
#include <stdio.h>
struct A{
    short b;
    char a;
    int c;
};
int main(int argc, const char *argv[])
{
    char array[100] = {0x0,0x0,0,0,0,0,0,0,0};
    struct A *aa = (struct A *)array;
    aa->b = 0x1122;
    aa->a = 0x33;
    aa->c = 0x01223344;
    int i;

    printf("sizeof(struct A) = %d\n", sizeof(struct A));
    for (i = 0; i < sizeof(struct A); i++)
    {
        printf("%#2x ", array[i]);
    }
    putchar(10);

    return 0;
}

执行结果是:

sizeof(struct A) = 8
0x22 0x11 0x33 0 0x44 0x33 0x22 0x1

如果结构体是这种:

struct A{
    char a;    //这两个位置互换
    short b;    //至两个位置互换
    int c;
};

sizeof(struct A) = 8
0x33 0 0x22 0x11 0x44 0x33 0x22 0x1


结论/方法:

  • 当一个结构体中有不同的数据时,在 linux 中遵循 1,2,4的对齐方式,注意没有 8
  • 结构体中的占字节数最多的元素决定二维容器的宽度
  • 最近的两个数据要对齐到其中最大的边界上,小的那个要用0来对齐。比如 1,2 则对齐的方式是1 0 2 。

图形表示:

在程序一和程序二中内存的情况是:

这里写图片描述 这里写图片描述

1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

C++ 字节对齐分析,struct成员指定位大小

阅读C++ Concurrency In Action 第5章遇到这个问题,记录下来,方便以后回头看 主要涉及 位域和字节对齐问题,位域一般不常见,属于C/C++高级特性 位域指的是针对s...
  • hit0803107
  • hit0803107
  • 2016-10-10 17:48
  • 1597

IAR中使用struct强制对齐时的一个问题及解决

最近在用IAR开发MSP430程序过程中发现了一个问题,具体描述是这样的 首先定义了一个struct并强制1个字节对齐#pragma pack(push) //保存对齐状态 #pragma pack(...
  • xinyunyxq
  • xinyunyxq
  • 2014-02-14 15:46
  • 3074

struct 字节对齐详解与大小端模式

一.什么是字节对齐,为什么要对齐?     现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地...
  • Lu597203933
  • Lu597203933
  • 2015-04-02 14:17
  • 3068

C++:struct和union 内存字节对齐问题

struct内存对齐问题1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始...
  • wangyanguiyiyang
  • wangyanguiyiyang
  • 2016-11-23 21:16
  • 386

struct与union字节对齐问题

C 语言的一大优势就是对内存空间的控制,当然,在面向对象语言的压力下,程序员更喜欢轻松的语言,不喜欢自己还要顾虑内存空间。         可是,C 语言仍然有很强的生命力,尤其是在操作系统、嵌...
  • enen199202
  • enen199202
  • 2015-09-02 20:59
  • 213

字节对齐问题(struct中)

原文出处:【点击,进入原文页面】 今天在看结构体和共用体部分的时候,遇到了一个新名词“内存对齐”。先引入问题吧。如下: struct student { char name[20]; int ...
  • dreambegin
  • dreambegin
  • 2011-09-27 17:17
  • 1351

struct字节对齐问题

struct自己对齐是面试中几乎必问的问题,但是真正十分清楚的人感觉很少,包括我自己,没有特别花时间研究下。 这里主要使用VC测试工具进行测试。g++之类的没有尝试过。 为了提高CPU的存储速度...
  • konglingbin66
  • konglingbin66
  • 2015-06-03 12:56
  • 675

struct字节对齐问题

(有错的地方希望大家指出来,谢谢!!) 这个问题我一直处在模糊的状态,今天终于搞清楚了,和大家分享一下吧! struct是一种的复合数据类型,其构成元素既可以是基本数据元素(int,float),...
  • chenjian723122704
  • chenjian723122704
  • 2011-11-24 09:30
  • 389

sizeof(struct)--关于字节对齐的问题

和很多IT新人一样,经常对结构体的 size 搞不太清楚,于是今天花了点儿时间仔细研究了一下,记录如下以便参考。   问题1:对如下程序其运行结果是什么? int main() { typed...
  • woxiwangxuehaocpp
  • woxiwangxuehaocpp
  • 2012-04-22 02:10
  • 298

C/C++中的struct字节对齐问题

字节对齐问题在面试笔试中经常碰到,自己也在这里经常碰到坑,今天索性把这方面搞清楚,记录自己这方面的学习过程。大端小端法机器的大端小端问题一直是一个常考的点,并且struct的内存布局问题和这个大端小端...
  • captainjackNO1
  • captainjackNO1
  • 2015-04-10 00:00
  • 574
    个人资料
    • 访问:273036次
    • 积分:5228
    • 等级:
    • 排名:第6097名
    • 原创:237篇
    • 转载:13篇
    • 译文:3篇
    • 评论:13条
    博客专栏