struct的成员对齐
注意:为了方便说明,等号左边是每个数据单独所占长度,右边是最终空间大小,以字节为单位。
一、什么时间存在对其问题:(32位机对齐方式是按照4字节对其的,以下所有试验都是在32位机上验证的)
  当结构体成员数据按照其顺序组合,无法按4字节对齐时,存在对其问题。
  如:
    1+1=2;
    1+2=3;
    1+2+1=4(而不是6或者其他);
    2+1=3;(不是4)
    以上是不存在对其问题的(因为没有超过4字节)。
  如:
    1+4=8;
    4+1=8;
    1+4+1=12;
    1+2+4=8;
    1+3+4=8;
    以上就存在对其问题,有超过4字节的数据。
二、存在对其问题时,应该如何对齐:
  当发生对其问题时,对其原则有两点:
  ①当所有成员数据和<=4时,结构体大小就是数据大小的和。
  ②连续数据类型的数据,如果可以组合成4,则将其组合,以节省空间。
  ③当和>4时,小于4字节的数据类型,其实际大小取min(4,max(所有数据类型大小))。注:所有数据类型大小,实质基本数据类型,不包括数组,结构体,
  如:
    char[5]  5=5;        超过的一个字符,时间大小=min(4,1)=1;
    1+2+4=8;           组合1、2,结果为8,而不是12.
    char + double +char =16;   实际是4+8+4=16;
    
附录:
①在32位机中下边基本数据类型及其长度(byte):
char:   1
short:   2
int:   4 
long:   4
long long:8
pointer: 4
enum:  4
double:  8
float:   4
 

struct的成员对齐问题-结构体实际大小问题的更多相关文章

  1. <摘录>字节对齐与结构体大小

    说明: 结 构体的sizeof值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐问题.这些问题在平时编程的时候也确实不怎么用到,但在一 些笔试面试题目中出是常常出现,对sizeo ...

  2. typedef struct xxx xxx与struct xxx区别 && “->”和“.”访问结构体变量

    1. struct //是C中的结构体的关键词.如: stuct node{ int a;.....} a; node 相当于结构体的类型,关键是其实在C中stuct node 才相当于一个数据类型, ...

  3. 关于结构体占用空间大小总结(#pragma pack的使用)

    关于C/C++中结构体变量占用内存大小的问题,之前一直以为把这个问题搞清楚了,今天看到一道题,发现之前的想法完全是错误的.这道题是这样的: 在32位机器上,下面的代码中 class A { publi ...

  4. sizeof()计算结构体的大小

    简要说明:结构体成员按照定义时的顺序依次存储在连续的内存空间,但是结构体的大小并不是简单的把所有成员大小相加,而是遵循一定的规则,需要考虑到系统在存储结构体变量时的地址对齐问题. 一.没有成员的结构体 ...

  5. Linux中的两个经典宏定义:获取结构体成员地址,根据成员地址获得结构体地址;Linux中双向链表的经典实现。

    倘若你查看过Linux Kernel的源码,那么你对 offsetof 和 container_of 这两个宏应该不陌生.这两个宏最初是极客写出的,后来在Linux内核中被推广使用. 1. offse ...

  6. C语言中内存对齐与结构体

    结构体 结构体是一种新的数据类型,对C语言的数据类型进行了极大的扩充. struct STU{ int age; char name[15]; }; struct STU a; //结构体实例 str ...

  7. 【2017-07-01】Linux应用开发工程师面试问题记录之二:关于结构体的大小及内存对齐问题

    Tencent后台服务器开发有一道题是计算一个结构体的sizeof的大小: struct strData { int m_Int; char m_Char; short m_Short; char m ...

  8. 【转】 申请对齐某种结构体大小的buffer

    在大多数情况下,编译器和C库透明地帮你处理对齐问题.POSIX 标明了通过malloc( ), calloc( ), 和 realloc( ) 返回的地址对于任何的C类型来说都是对齐的.在Linux中 ...

  9. 结构体的数据对齐 #pragma浅谈

    之前若是有人拿个结构体或者联合体问我这个结构占用了多少字节的内存,我一定觉得这个人有点low, 直到某某公司的一个实习招聘模拟题的出现,让我不得不重新审视这个问题, 该问题大致如下: typedef ...

随机推荐

  1. SICP 1.1-1.5

    1.1 a = b = nil 1.2 (/ (+ (- (- (+ (/ ))))) (* (- ) (- )) 1.3 a = b = nil 1.4... 1.5 (define (p) (p) ...

  2. body-content取值的意义

    body-content的值有下面4种: <xsd:enumeration value="tagdependent"/> <xsd:enumeration val ...

  3. 慕课网-安卓工程师初养成-2-6 Java中的数据类型

    来源:http://www.imooc.com/code/1230 通常情况下,为了方便物品的存储,我们会规定每个盒子可以存放的物品种类,就好比在“放臭袜子的盒子”里我们是不会放“面包”的!同理,变量 ...

  4. NSString用法

    1 创造字符串 NSString *str1 = @"hello"; NSString *str2 = [NSString string]; NSString *str3 = [N ...

  5. Eclipse User Library Add/Edit/Remove

    1:前文 近来开发项目采用的技术是AngularJS+Bootstrap+Spring Boot+SpringMvc+JPA 的方式,创建的项目是 Java Project,对应的JAR文件需要添加到 ...

  6. devexpress中应用于girdviw中HtmlDataCellPrepared事件与CellEditorInitialize事件的区别

    HtmlDataCellPrepared 事件为页面展示的时候对页面做的初始化(将id变为name) ​CellEditorInitialize 事件为页面在编辑时(新增.修改)时做的初始化,如将值填 ...

  7. @service中构造方法报错

    因为类首先被Spring实例化的时候,会调用构造函数.只有实例化后,才会注入.你等于没注入就调用了,所以报错.

  8. web.config中sessionState节点的配置方案

    web.config中sessionState节点的配置方案 web.config关于sessionState节点的配置方案,sessionState有五种模式:Custom,off,inProc,S ...

  9. 10 Code Coverage Tools for C & C++

    Code coverage is a measure used in software testing that describes the degree to which the source co ...

  10. Unieap3.5-Grid编辑列中数字与下拉改变

    Grid列表中字段改变事件 <cell label="单据金额" width='20%' name="NFEE_1" id="NFEE_1&qu ...