C语言之字节对齐
在C语言编程中,有时为了达到减少运行的时间的目的,需要浪费一些空间;而有时为了节省空间,使它的运行时间增长。而字节对齐则是为了访问效率,用空间换取时间。
要掌握字节对齐,首先得明确一下四个概念:
1.基本数据类型的自身对齐值
在32位系统下基本数据类型有其自身的对齐值:
char 1个字节
short 2个字节
Int 4个字节
double 8个字节
2.程序指定的对齐值
用#pragma(value)显式指定对齐值value
3.自定义类型的自身对齐值
即结构体或类的成员自身对齐的最大值
4.自定义类型的有效对齐值
自定义类型的自身对齐值和指定对其中最小的值
#include<stdio.h>
typedef struct Test
{
char a;
double b;
int c;
}Test;
void main()
{
printf("sizeof(Test) = %d\n",sizeof(Test));
}
对于Test结构体来说,首先先列出来结构体中数据成员数据类型的大小:
char a占4个字节,double b占8个字节,int c占4个字节。求出结构体的大小分两个步骤:
1.从结构体的第一个元素往下看,下面的数据的大小是上面数据大小的整数倍,如b的大小为8,而a的大小为4,a不为b的整数倍,所以给a补4个字节,使为b的整数倍。注意上面的概念为这个数据上面的所有类型大小之和。
2.看是否与自定义类型的对齐值对齐。上面已经解释过了自定义类型的对齐值即结构体或类的成员自身对齐的最大值,对于这个例子来说,double数据类型的大小为Test结构体中最大的,所以Test结构体的对齐值为8.所谓对齐,就是看所有数据大小之和是否是自定义类型的对齐值的整数倍。
从上面我们发现,当数据排放位置不同,结构体所占大小会有所变化,当自定义类型中的元素按类型的大小从小到大排列时,所占空间最小。
当结构体中嵌套结构体时不要慌,只要把构体看成一个数据元素,求解顺序跟上面的步骤是一样的。
当结构体按一个字节对齐时,结构体大小就是各成员自身大小之和。
当程序用#pragma(value)指定对齐值为value时,就要考虑有效的对齐值,如上所言:自定义类型的自身对齐值和指定对其中最小的值,这是什么意思呢?就拿上面的例子来说,如果指定对齐的value为4的话,自定义类型自身的对齐值为8,但是程序指定对齐值为4,所以他的有效对齐值为二者中最小的那个,即结构体的有效对齐值为4.针对这个例子,b占8个字节,a占一个字节,c占4个字节,所以给a补齐3个字节,所以结构体的总大小就是16个字节,是4的整数倍,不再需要补齐。因此最终结构体的大小就是16.
当内嵌结构体有名字时,结构体上升为类型,不占空间大小,而内嵌结构体有名字时,可以简单地看做其内部数据成员,不过要受到内嵌结构的约束,并且内嵌结构体自身也要对齐。
C语言之字节对齐的更多相关文章
- 转载:C语言的字节对齐及#pragma pack的使用
C语言的字节对齐及#pragma pack的使用 C编译器的缺省字节对齐方式(自然对界) 在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间. 在结构中,编译器为结构的每个成员 ...
- 【C语言】字节对齐(内存对齐)
数据对齐 1. 对齐原则: [原则1]数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma p ...
- 【C语言】字节对齐问题(以32位系统为例)
1. 什么是对齐? 现代计算机中内存空间都是按照字节(byte)划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型 ...
- C语言学习 - 字节对齐
字节对齐 字节对齐就是数据在内存中的位置. 假设一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐.比方在32位cpu下.假设一个整型变量的地址为0x00000004,那它就是自然对齐的. ...
- C语言:内存字节对齐详解[转载]
一.什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问, ...
- C语言:内存字节对齐详解
转:http://blog.csdn.net/arethe/article/details/2548867 一.什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论 ...
- C语言中内存对齐方式
一.什么是对齐,以及为什么要对齐: 1. 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问, ...
- <摘录>字节对齐(强制对齐以及自然对齐)
struct {}node; 32为的x86,window下VC下sizeof(node)的值为1,而linux的gcc下值为0: 一.WINDOWS下(VC--其实GCC和其原理基本一样,象这种问题 ...
- C语言的struct/union字节对齐
C语言的一大优势就是对内存空间的控制,当然,一般情况下对于开发人员来说都是透明的.看一个始终困扰初学者的问题:字节对齐! 先看四个重要的基本概念:1.数据类型自身的对齐值:对于char型数据,其自身对 ...
随机推荐
- org.eclipse.wst.common.project.facet.core.xml文件模板,解决eclipse编译报错。
<?xml version="1.0" encoding="UTF-8"?> <faceted-project> <fixed f ...
- 浏览器执行js
Scriptish chrome自带 greasemonkey http://www.firefox.net.cn/forum/viewtopic.php?f=5&t=45715
- HTML5程序设计--SVG
SVG(Scalable Vector Graphics):可缩放矢量图形,一种二维图形表示语言. 借助SVG,我们可以实现很多同Canvas API类型的绘制操作,但在Canvas元素上绘制文本的时 ...
- POJ 1631
#include <iostream> #define MAXN 500005 using namespace std; int T[MAXN]; int binary_search(in ...
- 妙味课堂——HTML+CSS(第二课)
常见标签——img标签 <img src="图片地址" alt="图片名"/> alt属性是图片名字,是给百度搜索引擎抓取使用的.也有当图片地址不正 ...
- hdu2025查找最大元素
#include<iostream> #include<stdio.h> #include<math.h> #include<stdlib.h> #in ...
- Linux服务器 scp 不需要密码配置与密钥转换(id_rsa->ppk)
案例:▲服务器A对服务器B.C进行ssh连接,免输入密码 或▲服务器A向服务器B.C复制文件(源文件在服务器A上),免输入密码 主机A:192.168.0.221主机B:192.168.0.22 ...
- Bootstrap下拉菜单dropdown-menu
1.步骤 (1)要做为下拉菜单的li增加class="dropdown" (2)为li中文字添加超链接<a data-toggle="dropdown" ...
- JavaWeb笔记——三大组件之过滤器
过滤器JavaWeb三大组件之一,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的. 当用户请求某个Servlet时,会先执行部署在这个请求上的Filter,如果Filter“ ...
- 如何在Eclipse中添加Tomcat的jar包
原文:如何在Eclipse中添加Tomcat的jar包 右键项目工程,点击Java Build Path 点击Add Library,选择Server Runtime 选择Tomcat版本 此时就看到 ...