特别的字节对齐问题

简介: 有如下一个结构体: struct X {         uint32_t a;         char* b[0]; }; sizeof(X)的值为多少了? 关键点:数组维度为0的成员不参与,但是它的类型参与。
有如下一个结构体:
struct X
{
        uint32_t a;
        char* b[0];
};
sizeof(X)的值为多少了?


关键点:数组维度为0的成员不参与,但是它的类型参与。
注:在x86_64上“char*”的algin值为8,x86上为4。


那么:
#pragma pack(8)
struct X
{
        uint32_t a;
        char* b[0];
};
#pragma pack()
sizeof(X)值为8,因为alignof(char*)和pack(8)最小值为8,故按8字节对齐。


#pragma pack(4)
struct X
{
        uint32_t a;
        char* b[0];
};
#pragma pack()
sizeof(X)值为8,因为alignof(char*)和pack(4)最小值为4,故按4字节对齐。


#pragma pack(1)
struct X
{
        uint32_t a;
        char* b[0];
};
#pragma pack()
按1字节对齐时,sizeof(X)值为8,因为alignof(char*)和pack(1)最小值为4,故按1字节对齐。


如果结构体变成:
struct X
{
        uint32_t a;
        char b[0];
};
sizeof(X)的值为多少了?

相关文章
|
2月前
|
存储 安全 编译器
内存对齐:C/C++编程中的重要性和技巧
内存对齐:C/C++编程中的重要性和技巧
73 1
|
存储 缓存 Oracle
常识四堆外内存
常识系列,作为一名互联网门外汉的科普系列 堆外内存除了在像netty开源框架中,在平常项目中使用的比较少,在现前的项目中,QPS要求高的系统中,堆外内存作为其中一级缓存是相当有成效的。所以来学习一下,文中主要涉及到这三分部内容 1. 堆外内存是什么?与堆内内存的区别 2. 怎么分配,与GC的影响 3. 开源框架使用 这篇文章写到最后,发现还只是回答了开源框架OHC的Why not use ByteBuffer.allocateDirect()?
1297 1
常识四堆外内存
|
存储 缓存 程序员
C++ 中的内存对齐——理论篇
> 本文作为上篇主要介绍内存对齐的理论基础,后续的下篇将侧重于 C++ 语言层面的实践,敬请期待! ### TL;DR - 处理器以若干字节的块而不是单字节的粒度访问内存,因此对于未对齐的内存需要额外的访存及计算开销,导致性能更差。 - 原子操作和矢量运算指令要求内存地址必须是对齐的,否则可能导致程序死循环和数据错误。 - 编译器通过 padding 自动对结构中的字段进行对齐,用以向后兼容以
703 0
C++ 中的内存对齐——理论篇
|
12月前
学C的第五天(初识指针,内存产生内存单元地址过程,指针函数介绍和其大小;结构体补充)-1
13*指针: 13.1 -- 内存: 内存是电脑上特别重要的存储器,计算机中程序的运行都是在内存中进行的。 【32位操作系统的内存由32根地址线产生的高低电位(1/0), 划分为2的32次方个地址(编号\指针),一个地址为一个字节, 等于8比特。】
|
12月前
|
存储 C语言
|
存储 编译器 C语言
深度理解C语言六——结构体内存对齐和结构体所占内存空间的大小
深度理解C语言六——结构体内存对齐和结构体所占内存空间的大小
128 0
深度理解C语言六——结构体内存对齐和结构体所占内存空间的大小
|
存储 编译器 C语言
【多级指针】带你从反汇编角度认识指针,C语言指针,多级指针【滴水逆向三期(36)笔记】(下)
【多级指针】带你从反汇编角度认识指针,C语言指针,多级指针【滴水逆向三期(36)笔记】(下)
|
存储 编译器 C语言
【多级指针】带你从反汇编角度认识指针,C语言指针,多级指针【滴水逆向三期(36)笔记】(上)
【多级指针】带你从反汇编角度认识指针,C语言指针,多级指针【滴水逆向三期(36)笔记】
|
C语言 C++
结构体的基础知识,足够详细
结构体的基础知识,足够详细
67 0
结构体的基础知识,足够详细
|
C++
如何计算:结构体内存的大小(在结构体的考察中占据非常重要的地位)
如何计算:结构体内存的大小(在结构体的考察中占据非常重要的地位)
117 0
如何计算:结构体内存的大小(在结构体的考察中占据非常重要的地位)