C语言内存对齐对则】的更多相关文章

一.字节对齐基本概念 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同.一些平台对某些特定类型的数据只能从某些特定地址开始存取.比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐.其…
接上一篇:C语言内存对齐详解(1) VC对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式.VC 中提供了#pragma pack(n)来设定变量以n字节对齐方式.n字节对齐就是说变量存放的起始地址的偏移量有两种情况: 第一.如果n大于等于该变量所占用的字节数,那么偏移量必须满足默认的对齐方式: 第二.如果n小于该变量的类型所占用的字节数,那么偏移量为n的倍数,不用满足默认的对齐方式. 结构的总大小也有个约束…
接上一篇:C语言内存对齐详解(2) 在minix的stdarg.h文件中,定义了如下一个宏: /* Amount of space required in an argument list for an arg of type TYPE. * TYPE may alternatively be an expression whose type is used. */ #define __va_rounded_size(TYPE) \ ((() / sizeof (int)) * sizeof (…
一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同.一些平台对某些特定类型的数据只能从某些特定地址开始存取.比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保…
前两天参加了360测试实习生的笔试,碰到了一个有关c语言内存对齐的题目,回来后实现了一下,下面是代码: #include <stdio.h> #include <stdlib.h> //#pragma pack(2) struct s1{ int a; char b; char c; double d; }; struct s2{ char b; int a; char c; }; struct s3{ char b; char c; int a; }; struct s4{ ch…
#include <stdio.h>#pragma pack(4)struct stu{char a;short b;int c;char d;};int main(){printf("%d\n", sizeof(struct stu));return 0;}#pragma pack(4) // pack(n) n=2^n windows默认值8 linux 默认值是4/* 1.取pack(n) n 取结构体中最大的成员数据类型大小m 取小得 k= (m<n ? m:…
转:http://blog.csdn.net/embeddedman/article/details/7429976 首先由一个程序引入话题:  1 //环境:vc6 + windows sp2 2 //程序1 3 #include <iostream> 4  5 using namespace std; 6  7 struct st1  8 { 9     char a ;10     int  b ;11     short c ;12 };13 14 struct st215 {16  …
这篇文章讲的非常好  :  http://blog.csdn.net/hairetz/article/details/4084088 用空间换时间, 规则 : 每个数据成员存储的起始位置都要是它的整数被或者它子成员的整数倍,  并且结构体总长度是它内部最大成员的整数倍, 不足补齐. #include<stdio.h> typedef struct a{ int id; //[0]...[3] double height; //[8]...[15] ]; //[20]...[29] //整体长度…
在解释内存对齐的作用前,先来看下内存对齐的规则: 1. 对于结构的各个成员,第一个成员位于偏移为0的位置,以后每个数据成员的偏移量必须是min(#pragma pack()指定的数,这个数据成员的自身长度) 的倍数. 2. 在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行. #pragma pack(n) 表示设置为n字节对齐. VC6默认8字节对齐 以程序1为例解释对齐的规则 : St1…
内存对齐 为保证程序顺利高效的运行,编译器会把各种类型的数据安排到合适的地址并占用合适的长度,这就是内存对齐 每种类型的对齐值就是他的内存边界 64位 类型 对齐边界 (对齐值) int8 1byte int16 2byte int32 4byte int64 8byte string 8byte 32位 类型 对齐边界(对齐值) int8 1byte int16 2byte int32 4byte int64 4byte string 4byte 内存对齐要求数据存储地址以及占用的的字节数都要…
一.什么是字节对齐,为什么要对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同.一些平台对某些特定类型的数据只能从某些特定地址开始存取.比如有些架构的CPU在访问一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保…
在<C陷阱与缺陷>有这样一个例子: #include <stdio.h> int main(void) { int i; char c; ;i<;i++){ scanf("%d",&c); printf("%d ",i); } printf("\n"); ; } 这个例子是讲printf和scanf函数接受函数应注意的情况的.运行这个例子,会发现,输入1,2,5,7等数,输出一直是0.这是因为scanf读入一…
C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的变量总长度要大,这是怎么回事呢? 开始学的时候,也被此类问题困扰很久.其实相关的文章很多,感觉说清楚的不多.结构体到底怎样对齐? 有人给对齐原则做过总结,具体在哪里看到现在已记不起来,这里引用一下前人的经验(在没有#pragma pack宏的情况下): 原则1.数据成员对齐规则:结构(struct或…
昨天看Q3的代码,看到有个_INTSAIZEOF的宏,着实晕了一阵.一番google后,终于明白,这个宏的作用是求出变量占用内存空间的大小,先看看_INTSAIZEOF的定义吧: #define _INTSIZEOF(n) ( (sizeof(n) + sizeof(int) - 1) & ~(sizeof(int) - 1) ) (ANSI C标准下,_INTSAIZEOF宏定义在stdarg.h中,Q3中定义在bg_lib.h中:bg_lib.h -- standard C library…
一.什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 2. 对齐的作用和原因:各个硬件平台对存储空间的处理上有很大的不同.一些平台对某些特定类型的数据只能从某些特定地址开始存取.其他平台可能没有这种情况, 但是最常见的是如果不按照适合其平台的要求对数据存放进行对齐…
http://blog.csdn.net/xing_hao/article/details/6678048 一.内存对齐 许多计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k(通常它为4或8)的倍数,这就是所谓的内存对 齐,而这个k则被称为该数据类型的对齐模数(alignment modulus).当一种类型S的对齐模数与另一种类型T的对齐模数的比值是大于1的整数,我们就称类型S的对齐要求比T强(严格),而称T比S弱(宽 松).这种强制的要求一来简化了处…
在最近的项目中,我们涉及到了“内存对齐”技术.对于大部分程序员来说,“内存对齐”对他们来说都应该是“透明的”.“内存对齐”应该是编译器的“管辖范围”.编译器为程序中的每个“数据单元”安排在适当的位置上.但是C语言的一个特点就是太灵活,太强大,它允许你干预“内存对齐”.如果你想了解更加底层的秘密,“内存对齐”对你就不应该再透明了. 一.内存对齐的原因 大部分的参考资料都是如是说的: 1.平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的:某些硬件平台只能在某些地址处取某些特定类…
在C语言开发当中会遇到这样的情况: #include <stdio.h> struct test { int a; char b; }; int main(int argc, const char * argv[]) { printf("%lu\n", sizeof(struct test)); ; } sizeof操作输出的结果是8,可是int和char类型的长度加起来只有5,那么为什么输出了8呢? 这就牵扯到结构体的内存对齐问题,事实上,结构体中的变量在内存当中并不是以…
最近看了好多,也编了好多C语言的浩强哥书后的题,总觉的很不爽,真的真的好怀念linux驱动的代码,好怀念那下划线,那结构体,虽然自己还很菜. 同时看了一遍陈正冲老师的C语言深度剖析,收益很多,又把唐老师的视频复习了一部分,感觉收获更多. 这阶段一直想写一篇博客,其实有好多东西,先写一下C语言中的内存对齐吧. 大家都知道,在C语言中定义一个变量,char是占用一个字节的,int占用四个字节,float占用四个字节,double占用八个字节,short占用两个字节,long int占用四个字节,lo…
转载请保留以下声明 作者:赵宗晟 出处:https://www.cnblogs.com/zhao-zongsheng/p/9099603.html 很多写C/C++的人都知道“内存对齐”的概念以及规则,但不一定对他有很深入的了解.这篇文章试着从硬件到C++语言.更彻底地讲一下C++的内存对齐. 什么是内存对齐(memory alignment) 首先,什么是内存对齐(memory alignment)?这个是从硬件层面出现的概念.大家都知道,可执行程序是由一系列CPU指令构成的.CPU指令中有一…
作者:赵宗晟 出处:https://www.cnblogs.com/zhao-zongsheng/p/9099603.html 很多写C/C++的人都知道“内存对齐”的概念以及规则,但不一定对他有很深入的了解.这篇文章试着从硬件到C++语言.更彻底地讲一下C++的内存对齐. 什么是内存对齐(memory alignment) 首先,什么是内存对齐(memory alignment)?这个是从硬件层面出现的概念.大家都知道,可执行程序是由一系列CPU指令构成的.CPU指令中有一些指令是需要访问内存…
C语言中内存对齐规则讨论(struct) 对齐: 现代计算机中内存空间都是按着byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就是需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐. 对齐的作用: 各个硬件平台对存储空间的处理上有很大的不同.一些平台对某些特定类型的数据只能从某些特定地址开始存储.其他平台可能没有这种情况,但是最常见的是如果不按照合适其平台的要求对数据进行对齐,会在…
struct 结构体 对于复杂的数据类型(例如学生.汽车等),C 语言允许我们将多种数据封装到一起,构成新类型. 跟面向对象语言中的对象相比,结构体只能包含成员变量,不支持操作. #include <stdio.h> #include <string.h> struct People { int age; char name[100]; // 这里如果用指针,下面用 strcpy 赋值时会报段错误 }; // 分号必须有 int main() { struct People p =…
结构体 结构体是一种新的数据类型,对C语言的数据类型进行了极大的扩充. struct STU{ int age; char name[15]; }; struct STU a; //结构体实例 struct STU *b; //结构体指针 1.可以通过a.age对其进行取成员的操作,b->age也可以进行结构体的操作,b->age存在问题,必须有一个结构体空间已经让b指向,b的值为此结构体空间的地址. 2.a.name = "lilei"; false,因为name是数组名…
今天一考研同学问我一个问题,一个结构体有一个int类型成员和一个char类型成员,问我这个结构体类型占多少个字节,我直接编个程序给他看结果.这个结构体占八个字节,咦,当时我蛮纳闷的,一个int类型四个字节,一个char类型一个字节,怎么这个结构体的大小不是五个字节呢??上网查了一下,结果发现还有个内存对齐的问题. 为了方便操作系统访问内存,一次访问四个字节,为了避免一个变量的二次访问,通常设置采用内存对齐. #include<stdio.h> typedef struct { int a; c…
转1个写的比较全面的. http://hubingforever.blog.163.com/blog/static/17104057920122256134681/ 本文编辑整理自:http://hi.baidu.com/pine515/blog/item/28f41f496042e8ee83025c4e.htmlhttp://blog.sina.com.cn/s/blog_4913c1f301000bip.html一. ANSI C标准中并没有规定,相邻声明的变量在内存中一定要相邻.,,.而且…
数据对齐 1.  对齐原则: [原则1]数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行. [原则2]结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行. [原则3]结构体作为成员:如果一个结构…
条件(先看一下各个基本类型都占几个字节): void size_(){ printf("char类型:%d\n", sizeof(char)); printf("int类型:%d\n", sizeof(int)); printf("float类型:%d\n", sizeof(float)); printf("double类型:%d\n", sizeof(double)); return; } 结果: 先来一下, 这个结构体在内…
从一个例子开始 象下面这样定义的结构体占几个字节? typedef struct{ char a; int i; } Sample; char占1个字节,int占4个字节,答案是5个字节? 错了.如果用 gcc 编译,sizeof(Sample) 的结果是8个字节. 这是怎么回事?进一步观察,Sample第0个字节是a, 而Sample的成员int i从第4个字节开始. 这是编译器为了内存对齐所做的优化. 什么是内存对齐 比如数据总线有32位,它访存只能4个字节4个字节地进行. 0-3,4-7,…
问题 突然收到了一个问题: #include<stdio.h> #include <math.h> struct icd { int a; //4 char b; //1 double c; //8 }; struct cdi { char a; double b; int c; }; int main(int argc, char const *argv[]) { printf("%d\n", sizeof(struct icd)); printf("…