`

错误示例:字节对齐

    博客分类:
  • c++
 
阅读更多
#include<vector>
#include<iostream>
#include<stdio.h>

struct student {
    char c;
    int age;
}__attribute__((packed));
//win32 系统中 codeblock 运行结果:为8,char和int换位置后结果为:5 

#pragma pack(push, 1)
struct student1 {
    char c;
    int age;
};
#pragma pack(pop)
//无论哪个平台结果都是5
int main() {
    student st;
    student1 st1;
    std::cout << sizeof(st) << std::endl;
    std::cout << sizeof(st1) << std::endl;
    return 0;
}

 在student结构体中,如果在结构体后面加__attribute__((packed)),char在int前和后,sizeof()计算出来的是不一样的,具体原因不清楚,暂时先记下来。但是如果是加 #pragma pack(push,1) 和 pragma pack(pop)就不会出现这个问题。

分享到:
评论

相关推荐

    字节对齐的详细解析于实例分析

    - 示例1中,结构体`test`在默认4字节对齐下,成员`x2`前填充1字节,`x4`后填充3字节,总共占用12字节。 - 示例2中,通过`#pragma pack(1)`强制1字节对齐,结构体`test`占用8字节,没有填充。 - 示例3中,使用`__...

    VS C++字节对齐方式

    然而,由于两种结构体的字节对齐方式不同,这种简单的内存投射会导致数据读取错误。这是因为`data_Byte`中的成员`float s_precision`和`short d_byte`在内存中被强制按4字节对齐,而`stream_Byte`中的成员没有遵循...

    嵌入式编程规范 字节对齐

    例如,在代码示例中通过`#pragma pack(2)`将结构体成员按2字节对齐,而`#pragma pack()`则恢复为默认的对齐方式。 3. **使用GCC扩展属性`__attribute__((aligned(n)))`**:这是一种更为灵活的方式来指定结构体成员...

    pack 字节对齐

    压缩包内的文件名大多是QQ截图,这可能是一系列的示例图片,用于展示或解释字节对齐的概念和使用#pragma pack后的效果。例如,这些图片可能包含内存布局的示意图,或者比较未使用#pragma pack和使用后的数据结构大小...

    不同的字节对齐下的申请的空间的比较源码

    通过分析提供的代码示例及其描述,我们可以深入了解字节对齐(Byte Alignment)这一概念,并探讨其在不同编译器设置下对结构体内存布局的影响。 ### 字节对齐概述 字节对齐是指数据在存储时按照某种特定的单位进行...

    C语言结构体的字节对齐及指定对齐方式.docx

    字节对齐是指在计算机内存中,结构体的成员变量按照一定的规则进行排列,以便提高存取效率和防止错误。不同的硬件平台对存储空间的处理方式不同,一些平台对某些特定类型的数据只能从某些特定地址开始存取。如果不...

    C 语言字节对齐

    例如,如果我们希望上述的结构体按照1字节对齐: ```c struct stu { char sex; int length; char name[10]; } __attribute__((aligned(1))); struct stu my_stu; ``` 这样定义后,`sizeof(my_stu)`的结果将是...

    V5-417_RTX实验_内存管理(4字节对齐).7z

    4字节对齐意味着内存分配时确保每个数据对象的地址能被4整除,这样可以优化处理器的性能,因为它可以一次性处理完整个字的数据,避免因非对齐访问带来的额外开销和潜在错误。 在RTOS RTX中,内存管理涉及任务堆栈、...

    c语言字节对齐

    ### C语言中的字节对齐详解 #### 一、引言 字节对齐是C语言编程中的一个重要概念,尤其在处理复杂数据结构时尤为重要。本文将深入探讨字节对齐的基本原理、目的以及如何在实际开发中进行合理配置。 #### 二、字节...

    C语言字节对齐详解

    在这个示例中,通过设置`#pragma pack(2)`,我们可以让所有的数据成员都按照2字节对齐。因此,整个结构体的大小变为8字节。这是因为`int`类型尽管需要4字节对齐,但由于我们已经显式地指定了2字节的对齐值,所以...

    申请字节对齐内存函数源代码

    然而,在某些特定场景下,如处理高性能计算、数据结构优化或者与硬件交互时,字节对齐的需求显得尤为关键。字节对齐是指内存地址按照特定的规则进行对齐,例如,某个变量可能需要在4字节或8字节的边界上开始,以提高...

    C语言字节对齐[归类].pdf

    - `struct B`的成员变量`b`、`a`和`c`的对齐:在默认对齐值为4的情况下,`b`的地址为0x0000,符合1字节对齐;`a`的地址必须是4的倍数,因此从0x0004开始;`c`作为2字节数据,可以紧接`a`之后存储。但由于结构体的...

    ARM程序由于字节对齐引起的问题深入分析

    本篇文章将深入探讨ARM程序中关于字/半字/字节对齐的问题,并通过具体的示例来帮助理解这一概念。 #### 字节对齐的概念 字节对齐是指数据在内存中的存储位置与该数据大小的关系。具体来说,在ARM架构中,为了提高...

    ucos堆栈中字节对齐的问题

    在示例中,堆栈大小的差异(8字节)使得`Task2`的堆栈顶与`Task3`的堆栈相邻,而浮点数处理时,可能涉及的底层汇编指令如`BIC r0,r2,#0x07`,这个指令用来确保地址是8字节对齐的。如果地址不对齐,浮点数的转换和...

    c++ 内存对齐的完整文档

    ##### 示例1:1字节对齐 ```cpp #pragma pack(1) struct test_t { int a; char b; short c; char d; }; ``` - **成员数据对齐**:`int`类型占用4字节,但按1字节对齐;`char`和`short`类型分别占用1字节和2字节...

    V5-418_RTX实验_内存管理(8字节对齐).7z

    在“V5-418_RTX实验_内存管理(8字节对齐)”的文件中,可能包含了相关的代码示例、实验指导和分析结果,这些资料可以帮助我们更深入地理解和应用这些概念。通过实际操作和分析,开发者能够掌握如何在RTX环境下有效...

    ARM重定向代码字节对齐问题

    ARM重定向代码字节对齐问题 ARM重定向代码字节对齐问题是ARM学习过程中常见的问题,当我们使用链接脚本时,可能会碰到字节对齐的问题。下面我们将详细解析这个问题。 一、 ARM重定向代码 ARM重定向代码是指在ARM...

    Excel-VBA编程的常用代码.docx

    除了上述类型外,VBA还支持其他类型,如`Byte`(字节)、`Boolean`(布尔)、`Long`(长整型)、`Single`(单精度浮点数)、`Double`(双精度浮点数)、`Date`(日期时间)等。 **强制声明变量**: 为了减少程序中的...

    编译器数据对齐方式(结构体、类所占空间的计算)

    在这里,指定对齐参数为8字节,所以class B的大小是4字节对齐参数的整数倍,即sizeof(B) = 8。 编译器还提供宏定义`#pragma pack`用于指定结构体的对齐参数。例如,`#pragma pack(1)`会改变默认的对齐参数为1,这会...

Global site tag (gtag.js) - Google Analytics