内存对齐详解
1、什么是内存对齐
假设我们声明两个变量:
2、结构体内存对齐规则
结构体所占用的内存与其成员在结构体中的声明顺序有关,其成员的内存对齐规则如下:
(1)每个成员分别按自己的对齐字节数和PPB(指定的对齐字节数,32位机默认为4)两个字节数最小的那个对齐,这样可以最小化长度。
(2)复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度。
(3)结构体对齐后的长度必须是成员中***的对齐参数(PPB)的整数倍,这样在处理数组时可以保证每一项都边界对齐。
(4)计算结构体的内存大小时,应该列出每个成员的偏移地址,则其长度=最后一个成员的偏移地址+最后一个成员数的长度+最后一个成员的调整参数(考虑PPB)。
3、案例讲解:
————————————————
最后输出的结果为:8
4、注意的问题
(1)字节对齐取决于编译器;
(2)一定要注意PPB大小,PPB大小由pragam pack(n)指定;
(3)结构体占用的字节数要能够被PPB整除。
(4)总结出一个公式:结构体的大小等于最后一个成员的偏移量加上其大小再加上末尾的填充字节数目,即:
sizeof( struct ) = offsetof( last item ) + sizeof( last item ) +sizeof( trailing padding )
————————————————
原文链接:
offsetof函数什么意思啊
offsetof宏的简介
定义
在stddef.h头文件中,该宏的完整说明如下:
#ifdef __cplusplus
#ifdef _WIN64
#define offsetof(s,m) (size_t)( (ptrdiff_t)reinterpret_castconst volatile char((((s *)0)-m)) )
#else
#define offsetof(s,m) (size_t)reinterpret_castconst volatile char((((s *)0)-m))
#endif
#else
#ifdef _WIN64
#define offsetof(s,m) (size_t)( (ptrdiff_t)(((s *)0)-m) )
#else
#define offsetof(s,m) (size_t)(((s *)0)-m)
#endif
#endif
功能
该宏用于求结构体中一个成员在该结构体中的偏移量。
在msdn上,该宏被写作:
size_t offsetof( structName, memberName );
***个参数是结构体的名字,第二个参数是结构体成员的名字。该宏返回结构体structName中成员memberName的偏移量。偏移量是size_t类型的。
编辑本段
程序示例
#include stdio.h
#include stddef.h
typedef struct
{
int iVal;
int iVal2;
}Test;
typedef struct
{
char ch;
int iNum;
}Test2;
int main(void)
{
Test t = {1, 2};
Test2 t2 = {'t', 100};
printf("naddress of t : %pnaddress of t.iVal : %pnaddress of t.iVal2: %pnn", t, (t.iVal), (t.iVal2));
printf("offset of iVal in t: %pn", offsetof(Test, iVal));
printf("offset of iVal2 in t: %pn", offsetof(Test, iVal2));
printf("naddress of t2 : %pnaddress of t2.ch : %pnaddress of t2.iNum: %pnn", t, (t2.ch), (t2.iNum));
printf("offset of ch in t2: %pn", offsetof(Test2, ch));
printf("offset of iNum in t2: %pn", offsetof(Test2, iNum));
return 0;
}
在VS2005中输出:
address of t : 0012FF10
address of t.iVal : 0012FF10
address of t.iVal2: 0012FF14
offset of iVal in t: 00000000
offset of iVal2 in t: 00000004
address of t2 : 0012FF10
address of t2.ch : 0012FF00
address of t2.iNum: 0012FF04
offset of ch in t2: 00000000
offset of iNum in t2: 00000004
需要注意的是,Test2中iNum成员的偏移量
offset在C语言中使用是什么意思啊??
意思是偏移值,通常用于指明一个位置,它的用法是把一个基底位置加上 offset 值 (offset 可以是负数)。 例如我们说 : 一个资料结构在内存中的位置是 0x125000,它的 offset 0x10 处是用户名字, offset 0x14 是用户序号。在 PE 结构中, offset 通常用于指明在 exe 档案中的实际位置
在手机的SEEM修改里,Offset就是数值的坐标位置,如:offset64就是指左边的横坐标0x060(行),上边的纵坐标x04(列);offset1E,就是指左边的横坐标0x010(行),上边的纵坐标x0E(列)。
lrc歌词中会经常见到[offset:500]这样的说明,指的是卡拉OK歌词滚动时的偏移量
C语言中的宏定义:
offsetof (type,member)
返回值:2个地址的偏移量,***个地址是结构体名字,第二个地址是结构体成员,
所以返回的是二者之间的以byte为单位的偏移量
由于c++中struct已经强化为类,the use of offsetof is restricted to "POD types".
例子:
#include stdio.h
#include stddef.h
struct mystruct
{
char singlechar;
char arr***member[10];
char anotherchar;
};
int main ()
{
printf ("offsetof(mystruct,singlechar) is %dn",offsetof(mystruct,singlechar));
printf ("offsetof(mystruct,arr***member) is %dn",offsetof(mystruct,arr***member));
printf ("offsetof(mystruct,anotherchar) is %dn",offsetof(mystruct,anotherchar));
return 0;
}
Offset:引用函数,可以引用区域和单元格
语法:=Offset(reference,rows,cols,height,width)***个参数是原点,第二个参数是
偏移的行,第三个参数是偏移的列,第四个参数是行高,第五个参数是列宽
c语言里:sizeof怎样用法?
1、首先打开VS,新建一个 使用sizeof求出数组的大小 project。
2、接着在左侧文件树添加一个 sizeof.c 源文件。
3、其里面有stdio.h和stdlib.h头文件,也可自己输入。
4、然后输入main函数主体及返回值。
5、定义一个数组,使用sizeof计算出数组的大小。
6、最后编译运行程序,便能输出数组的大小。
c语言中container_of, typeof, offsetof这些是哪个标准的?
1. container_of是Linux内核中实现的宏,不是C语言的标准函数。不能跨平台。
#define container_of(ptr, type, member) ({
const typeof( ((type *)0)-member ) *__mptr = (ptr);
(type *)( (char *)__mptr - offsetof(type,member) );})
2. typeof是GNU C的扩展,不是ISO标准中的函数。用gcc编译可以跨平台。
3. offsetof是C语言标准库中的宏,定义在头文件stddef.h中。可以跨平台。
关于offsetof和offsetof宏定义的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。