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

C++ 如何修复C++;gcc编译结构填充警告,c++,compiler-warnings,gcc-warning,suppress-warnings,C++,Compiler Warnings,Gcc Warning,Suppress Warnings,我有以下看起来无害的代码: void myFunc(){ struct stance { long double interval; QString name; }; // [...] } 当我在Ubuntu18.04上使用标准版的gcc构建它时,我得到如下警告: cpp:12:警告:将“站姿”的大小填充为8字节 路线边界(-wp已添加) 我知道出现此警告是因为编译器需要将我的结构的填充调整为我可能没有预料到的内容,并且非常好心地警告我作

我有以下看起来无害的代码:

void myFunc(){
    struct stance {
        long double interval;
        QString name;
    };
    // [...]
}
当我在Ubuntu18.04上使用标准版的gcc构建它时,我得到如下警告:

cpp:12:警告:将“站姿”的大小填充为8字节 路线边界(-wp已添加)

我知道出现此警告是因为编译器需要将我的结构的填充调整为我可能没有预料到的内容,并且非常好心地警告我作为用户

但是,我正在尝试创建一个无警告的构建,因此问题是,如何以符合标准的方式在代码中显式显示编译器不需要发出此警告?

因此,要明确的是,我不想在构建脚本中抑制警告,也不想使用#pragma或类似的方法。我想更改此结构的代码,以便我的对齐预期是明确的,并且匹配编译器想要执行的任何操作,因此不需要显示警告

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

看起来你想要这个,并使用它。因此,您至少需要C++11,并且您可能希望禁用该警告(或者-好吧,不要启用它,我不知道有任何类似于
-Wall
-Wextra
的警告集包含它)
-Wpadded
并不意味着始终启用,除非您希望始终手动明确指定必要的填充

-Wpadded

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

(增加重点)

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

一般来说,添加填充物并不是一个问题,总是会发生,而且在某些情况下,这是不可避免的。将其保持在最小值的一般规则是按减少对齐要求的顺序放置图元,但同样,也不能总是避免

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


奇怪的我的GCC没有警告选项
-wppadding
。您的版本是什么?很抱歉,添加了-wp,将更新QQ。您正在为自己做很多不必要的工作。除非对象大小和对齐对您的应用程序至关重要,否则这并不重要。我该如何使用它们呢?尽管这使它变得明确,但它并没有破坏gcc的警告。
struct stance {
    long double interval;
    char unused0[6];
    QString name;
    char unused1[8];
};