c++ - 如何从二进制文件填充结构,同时避免内存对齐填充引起的问题?

标签 c++ struct binaryfiles memory-alignment

我目前正在尝试使用以下代码读取位图文件头:

#include <fstream>
using namespace std;

struct BitMapFileHeader {
    uint16_t bfType;
    uint32_t bfSize;
    uint16_t bfReserved1;
    uint16_t bfReserved2;
    uint32_t bfOffBits;
} file_header;

int main() {
    ifstream fin;
    fin.open("input.bmp", ios::binary);

    fin.read(reinterpret_cast<char*>(&file_header), sizeof(file_header));

}
我文件的前几个字节是42 4D 36 53 07 00 00 00file_header.bfType显示第一个和第二个字节中包含的19778的正确值,但是filder_header.bfSize显示7,它存储在第5个字节中,并且似乎跳过了第3个和第4个字节。
看来我遇到了this问题的第二个答案的注释中提到的问题。尽管确定了问题,但我不知道如何解决。有人可以指出我正确的方向吗?
编辑:由于性能问题和未对齐的内存访问,一些建议不要打包结构成员。除了一个一个地填充每个struct成员之外,还有什么方法可以避免这种性能损失?

最佳答案

在struct之后使用__attribute__ ((packed)):

struct BitMapFileHeader {
    uint16_t bfType;
    uint32_t bfSize;
    uint16_t bfReserved1;
    uint16_t bfReserved2;
    uint32_t bfOffBits;
} __attribute__ ((packed)) file_header;

关于c++ - 如何从二进制文件填充结构,同时避免内存对齐填充引起的问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64872214/

相关文章:

在 C 中从 char * 转换为 char[31]

c# - 由于其保护级别而无法访问结构

c - C中链表的结构

git - 如何防止在 git 中推送大型二进制 blob?

c++ - 为什么指向释放内存的引用有效?

c++ - "templating"命名空间

c++ - 我的 C++ 文件中是否可能存在内存泄漏?

c++ - 获得适用于 C++ 的正确编译器

binaryfiles - 使用 Extendscript 编写二进制文件。文件大小不正确

c++ - 用C++读写二进制信息