sizeof函数和对齐的问题

1.结构体对齐问题

32位机器

例子1:

结果:

例子2:
struct A{
   char c1;
   int i;
   short s;
   int j;
}a;

struct B{
   int i;
   int j;  
   short s;
   char c1;
}b;

结构A没有遵守字节对齐原则(为了区分,我将它叫做对齐声明原则),结构B遵守了。我们来看看在x86上会出现什么结果。

先打印出a和b的各个成员的地址。会看到a中,各个成员间的间距是4个字节。b中,i和j,j和s都间距4个字节,但是s和c1间距2个字节。所以:
sizeof(a) = 16
sizeof(b) = 12

总结:关于结构体对齐,结构体中最长者与系统设定之间,选择较小者作为对齐参数,当然也可以修改对齐参数:

#pragma pack(4)

struct a

{

};

#pragma pack()//恢复系统设置

2.sizeof类与sizeof对象的区别

时间: 2024-10-27 06:55:42

sizeof函数和对齐的问题的相关文章

sizeof()函数的使用——————【Badboy】

1.sizeof的使用:sizeof操作符以字节形式给出了其操作数的存储大小. sizeof操作符不能用于函数类型,不完全类型或位字段.不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型.未知内容的结构或联合类型.void类型等. 2.sizeof的结果:sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型.该类型保证能容纳实现所建立的最大对象的字节大小. int.unsigned int .short int.unsigned sh

C语言中的sizeof函数总结

sizeof函数的结果: 变量:变量所占的字节数. int i = 0; printf("%d\n", sizeof(i)); //4 数组:数组所占的字节数. int arr_int1[] = {1,2,3,4,5}; int arr_int2[10] = {1,2,3,4,5}; printf("size_arr1=%d\n",sizeof(arr_int1)); //5*4=20 printf("size_arr2=%d\n",sizeof

【C++】sizeof()函数解析

[1] 常见数据类型的的sizeof函数得出的值表 char int short long float double 指针 32 bit 1 4 2 4 4 8 4 64 bit 1 4 or 8 2 8 4 8 8 [2] 数组求sizeof 的值 数组的大小 = 数组中元素的个数 x 该类型的大小 [3] union 求 sizeof 的值 由于 union 中存在复写现象,union 结构的 sizeof 的值即为 union 中最大的元素的大小.例如: union student{   

sizeof函数总结

sizeof函数功能:计算数据空间的字节数 1.与strlen()比较 strlen计算字符数组的字符数,以"\0"为结束判断,不计算为'\0'的数组元素. sizeof计算数据(包括数组.变量.类型.结构体等)所占内存空间,用字节数表示(当然用在字符数组计算"\0"的大小). 2.指针与静态数组的sizeof操作 指针均可看为变量类型的一种.所有指针变量的sizeof 操作结果均为4. 实例1::char *p; sizeof(p)=4; sizeof(*p) =

CC++中sizeof函数的用法

C/C++中sizeof()函数的用法 学习C/C++有时会遇到下面的情况: 已知 char *str1="absde"; char str2[]="absde"; char str3[8]={'a'}; char str4 [] = "0123456789"; 为什么sizeof(str1)=4 sizeof(str2)=6; sizeof(str3)=8; sizeof(str4)=11;呢? 丈二和尚摸不着头脑,接下来我们一起好好讨论讨论,

sizeof函数详解

原文链接http://blog.csdn.net/wzy198852/article/details/7246836 sizeof,一个其貌不扬的家伙,引无数菜鸟竟折腰,小虾我当初也没少犯迷糊,秉着“辛苦我一个,幸福千万人”的伟大思想,我决定将其尽可能详细的总结一下.但当我总结的时候才发现,这个问题既可以简单,又可以复杂,所以本文有的地方并不适合初学者,甚至都没有必要大作文章.但如果你想“知其然,更知其所以然”的话,那么这篇文章对你或许有所帮助.菜鸟我对C++的掌握尚未深入,其中不乏错误,欢迎各

SIZEOF函数使用

参考  http://blog.csdn.net/wzy198852/article/details/7246836 1.语法 sizeof有三种语法形式,如下:1) sizeof( object ); // sizeof( 对象 );2) sizeof( type_name ); // sizeof( 类型 );3) sizeof object; // sizeof 对象; 2.计算 1)计算求值 sizeof(2) = sizeof(int); sizeof(2.22) = sizeof(d

c++编程思想(三)--c++中c 续,重点sizeof和内存对齐

之前理论性的太多,下面就是代码及理论结合了 1.sizeof()是一个独立运算符,并不是函数,可以让我们知道任何变量字节数,可以顺带学一下struct,union,内存对齐 内存对齐:为了机器指令快速指向地址值,编译器内部实际上会内存对齐,怎么理解了,以struct为例 先讲一下各个变量类型内存大小 所以struct理论上是:1+2+4+4+4+8+8 = 31,但是实际是 实际大小是32(1+2+1+4)+(4+4)+8+8 然后再把int和short位置调换 实际大小是40   (1+3)+

C语言 sizeof函数详解

1. 定义:sizeof是何方神圣sizeof乃C/C++中的一个操作符(operator)是也,简单的说其作用就是返回一个对象或者类型所占的内存字节数.MSDN上的解释为:The sizeof keyword gives the amount of storage, in bytes, associated with avariable or a type (including aggregate types). This keyword returns a value of type siz