错误是什么意思:..."bytes to alignment boundary" 在 Xcode/Clang 中?

What means the error : ..."bytes to alignment boundary" in Xcode/Clang?

本文关键字:Xcode Clang boundary alignment 意思 是什么 bytes to 错误      更新时间:2023-10-16

TransformNode with 4 bytes to alignment boundary

这是导致此警告的代码:

class TransformNode : public Node {
public:
    int number;
public:
    void test() { number = 12; }
};
//Node.h
class Node {
public:
    typedef std::set<Node *> ChildSet;
protected:
    ChildSet mChildren;
    Node * mParent;
public:
    Node(Node * parent=0) : mParent(parent) {}
    ~Node() {}
    Node * addChild(Node * node);
    inline Node * getParent() { return mParent; }
    const ChildSet &getChildren() const { return mChildren; }
};

inline void node_test() {
    TransformNode * node = new TransformNode;
    node->test();
    std::cout << node->number << "n";
}
int main() {
    node_test();
    return 0;
}

当我从类 TransformNode 派生 Node 类时会发生错误。我正在使用 xcode 5.0,所有警告都打开并将警告视为错误。我真的很想了解这段代码是怎么回事,所以只是关闭警告或停止将它们视为错误并不是我想要处理这个问题的方式。

编辑:添加了更多代码。澄清一些细节(粗体(

谢谢
加西姆

我不确定您所看到的是否真的是一个错误。 一般来说,"所有警告"包括各种几乎不被视为警告的东西;哎呀,在大多数情况下,它们甚至也不是超级信息量。

对齐是一个您可能不关心的问题,除非您使用非常特定的硬件,例如在嵌入式系统中。 可能正在发生的事情是,编译器默认为 8 字节对齐,当您定义 TransformNode 类时,您将为int分配 4 个字节,并"浪费"另外 4 个字节以将整个类对齐到 8 字节边界。 编译器警告告诉您有关"浪费"的 4 个字节的信息。 正如我所说,你可能不关心这个。

我认为一般来说,如果你打开了最大警告和警告作为错误,你只会让自己发疯。 如果您真的想要超级干净,则退后一级警告然后视为错误可能更有用。

重新编辑:根据最近的编辑澄清了答案。

另一个

想法:尝试在TransformNode类中添加另一个int,看看警告是否会消失(我假设它会消失,因为 #2 int会"用完"浪费"的 4 个字节(。

您还可以查看 http://en.wikipedia.org/wiki/Data_padding 以更好地了解问题。

您启用了什么警告选项来获取此特定警告?我只看到两种可能性。

  • -一切
    不要指定此选项。此选项仅供内部 Clang 使用。请参阅程序员姐妹站点 https://softwareengineering.stackexchange.com/questions/122608/clang-warning-flags-for-objective-c-development 上此问题的第一个答案。
  • -软垫
    如果你特别要求被警告填充,你为什么要问这个问题?

不要打开每个可能的警告标志。你最终会得到很多误报,所有这些噪音都会让你错过真正的警告。打开具有高信噪比的警告选项,然后注意发出的每个警告。