繁体   English   中英

如何修复C ++ gcc编译警告以填充结构

[英]How to fix C++ gcc compile warning for padding of struct

我有以下无害的代码:

void myFunc(){
    struct stance {
        long double interval;
        QString name;
    };
    // [...]
}

当我在Ubuntu 18.04上使用gcc的标准版本构建此文件时,会收到如下警告:

MySource.cpp:12:警告:“姿势”的填充大小有8个字节到对齐边界(-wpadded)

我知道出现此警告是因为编译器需要将我的结构的填充调整为我可能没有想到的某种程度,并且足以警告用户这一点。

但是,我试图建立一个无警告的版本,所以问题是, 如何以一种标准兼容的方式在我的代码中明确指出编译器不需要发出此警告?

为了清楚起见,我不想在构建脚本中禁止显示警告 ,也不想使用#pragma或类似命令。 我想更改该结构的代码 ,以便我的对齐期望是明确的,并且与编译器想要执行的操作匹配,因此不需要显示警告。

只需禁用警告(或者-好的,不要启用它,我不知道包含它的任何警告集,例如-Wall-Wextra )。 -Wpadded并不意味着始终启用,除非您想始终手动明确指定必要的填充。

-Wpadded

警告如果结构中包含填充,则将结构的元素对齐或将整个结构对齐。 有时,当发生这种情况时,可以重新排列结构的字段以减少填充,从而使结构更小。

(强调)

这是不可能的一种情况。 long double是10字节,需要16字节对齐(在x86 Linux上为4); QString实际上是一个指针,因此需要8字节对齐(在32位Linux上为4)。 您可以根据需要交换它们,但是如果要保持自然对齐(从而获得最佳性能),则将获得6 + 8字节的填充或8 + 6字节的填充。

通常,添加填充不是问题,它总是会发生,并且在不可避免的情况下会出现诸如此类的情况。 将其保持在最低限度的一般规则是按照减少对齐要求的顺序放置元素,但同样,不能总是避免这样做。

如上所述,唯一的选择(保持良好的对齐)是使填充显式显示,但这没有多大意义(除非您正在设计文件格式或其他内容,并且希望使所有内容显式显示,但是在这种情况下,您不会不使用QString并将其打包为1个字节)。

struct stance {
    long double interval;
    char unused0[6];
    QString name;
    char unused1[8];
};

我想更改此结构的代码,以便明确显示对齐期望

似乎您需要alignof运算符,并将其与alignas指定 符一起使用。 因此,您至少需要C ++ 11,并且可能需要std::alignment_of

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM