c语言自动对齐原则

转载一篇博客:

http://blog.csdn.net/hairetz/article/details/4084088

1:数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。

就是说每个成员要考虑之气那成员的地址来存储

比如

struct aa

{

short ss;//本来用两个字节就好了,但是因为int需要2*2个字节,ss如果只用2个字节存储,则a就不是从2*2整数倍数开始存储

int a;

}

2:结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储.)

就是当一个结构体里还有结构体则 该结构体从这个结构体里最变量最大字节数整倍开始存储

3:收尾工作:结构体的总大小,也就是sizeof的结果,.必须是其内部最大成员的整数倍.不足的要补齐.

就是最后面计算出来不足最大成员整数倍要增加到整数倍。

#include<iostream>
using namespace std;
typedef struct bb
{
 int id;             //[0]....[3]
 double weight;      //[8].....[15]      原则1
 float height;      //[16]..[19],总长要为8的整数倍,补齐[20]...[23]     原则3
}BB;

typedef struct aa
{
 char name[2];     //[0],[1]
 BB b;             //[24]......[47]          原则2
 int  id;         //[4]...[7]          原则1

 double score;     //[8]....[15]    
 short grade;    //[16],[17] 原则最后一条       

}AA;

int main()
{
cout<<sizeof(float);
}
时间: 2024-10-12 08:10:59

c语言自动对齐原则的相关文章

always语言指导原则

1.每个always只有一个@(event-expression). 2.always块可以表示时序逻辑和组合逻辑. 3.带有posedge和negedge关键字的是表示沿触发的时序逻辑,没有的表示组合逻辑或者电平敏感的锁存器.或者两者都表示. 4.每个在always快中赋值的信号必须定义成reg型或者整形(integer[<msb> :<lsb> ] identifier).整形变量默认是32位. 5.always块中应该避免组合反馈回路,always块中的赋值必须是明确的.否则

互联网产品跨部门沟通的10个原则(转)

摘要: 向对方重复沟通中的主要内容:利用澄清的方式提出不明白的内容:谈论重点议题时尽量不要打断对方讲话: 对产品经理来说,跨部门沟通不良,可能会让他好不容易建立起来的自信瞬间摧毁. 你认为十万火急的事,到了其它部门主管口中,竟然成了“芝麻绿豆大的事”:原本应该合作解决的问题,到了跨部门会议上,又沦为“各弹各的调”,找不到共识. 到底,在不同部门各有不同立场与利益的情况下,怎样才能把话说清楚,把成果做出来?很多人抱怨为什么跨部门沟通这么难?其实,只要掌握几个典型基本原则,进行无障碍的跨部门沟通,并

谈写代码的原则:性能高效 方法简洁 思路清晰 整体美观

我们的程序课只关心能不能把一个功能实现.不会关注怎么实现以及背后的我坚信性能非常重要,给客户做项目,三天两头出问题,动不动系统写出来的网站访问量一大就报503.经常遭到黑客攻击,资料被改得后果很严重. 举几个个课堂例子说明此原则: //字符串拼接 下面是课堂上的代码string sqlstr="insert into 库存('"+txt_hh+"'"+",'"+txt_hm + "','" +txt_gg + "',

Verilog学习笔记设计和验证篇(三)...............同步有限状态机的指导原则

因为大多数的FPGA内部的触发器数目相当多,又加上独热码状态机(one hot code machine)的译码逻辑最为简单,所以在FPGA实现状态机时,往往采用独热码状态机(即每个状态只有一个寄存器置位的状态机).建议采用case语句来建立状态机的模型,因为这些语句表达清晰明了,可以方便的由当前状态转向下一个状态并设置输出.记得:不要忘记在case语句的最后写上default分支,并将状态设置为'bx这就等于告诉综合器case语句已经指定了所有的状态.这样综合器就可以删除不必要的译码电路使生成

C语言函数的作用域规则

“语言的作用域规则”是一组确定一部分代码是否“可见”或可访问另一部分代码和数据的规则. “同一函数中,不同的结构体成员名能相同,当变量处于不同的作用域时,名称可以相同. 注:作用域,其对象是变量,而非表达式.” C语言中的每一个函数都是一个独立的代码块.一个函数的代码块是隐藏于函数内部的,不能被任何其它函数中的任何语句(除调用它的语句之外)所访问(例如,用g o t o语句跳转到另一个函数内部是不可能的).构成一个函数体的代码对程序的其它部分来说是隐蔽的,它既不能影响程序其它部分,也不受其它部分

JAVA开发语言基础

很多时候我们都不知道,为什么android最开始要用java作为基础语言 看看知乎上都是怎么回答的 为什么java最初成为android开发的基础语言 -------------------------------------- 1.避免Native作为应用代码导致的因为设备多样化导致App生态了支离破碎,是从Nokia哪里的教训. 2.重新实现Dalvik,一是避来自Oracle Java的产权问题,二是从Sun J2ME来的教训.Java在过去的发展累积下了很多为业务逻辑产生的人力资源链,而

信息安全-3:负数取模[转]

背景 最近在一道 Java 习题中,看到这样的一道题: What is the output when this statement executed:System.out.printf(-7 % 3); 正整数的取余运算大家都很熟悉,但是对于负数.实数的取余运算,确实给人很新鲜的感觉.于是我对此进行了一些探索.我发现,这里面还是颇有一点可以探索的东西的. 探究 首先,看看自然数的取模运算(定义1): 如果a和d是两个自然数,d非零,可以证明存在两个唯一的整数 q 和 r,满足 a = qd +

C++ 备忘录 (1)

取模: 1. 转载自:http://ceeji.net/blog/mod-in-real/ 1 背景 2 3 最近在一道 Java 习题中,看到这样的一道题: 4 5 What is the output when this statement executed: 6 System.out.printf(-7 % 3); 7 8 正整数的取余运算大家都很熟悉,但是对于负数.实数的取余运算,确实给人很新鲜的感觉.于是我对此进行了一些探索.我发现,这里面还是颇有一点可以探索的东西的. 9 10 探究

关于变量在for循环内外定义的思考

在c#或java里面,我们通常会这样写for循环: for(int i = 0;i<10;i++) { Console.WriteLine(i); } 前一阵子,我突发奇想,如果按照下面这样写,会不会比上面的运行效率高一些: int i = 0; for(; i<10 ;i++) { Console.WriteLine(i); } 因为我觉得最上面的那种方式,每次循环都会声明一个变量,说不定会影响效率,于是百度了一下,发现其他人也有这个疑惑,特意百度了一些资料,在此做个综合. 首先是在内层循环