3

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 を使用し、警告をエラーとして扱っています。このコードで何が起こっているのかを本当に理解したいので、警告をオフにするか、警告をエラーとして扱うのをやめるだけでは、これを処理したくありません。

編集: コードを追加しました。詳細の説明(太字)

ありがとう、
ガシム

4

2 に答える 2

4

表示されているものが実際にエラーであるかどうかはわかりません。一般に、「すべての警告」には、ほとんど警告と見なされないあらゆる種類のものが含まれます。ほとんどの場合、それらは非常に有益でもありません。

アライメントは、組み込みシステムのような非常に特殊なハードウェアで作業していない限り、おそらく気にしない問題です。おそらく何が起こっているのかというと、コンパイラがデフォルトで 8 バイトのアラインメントに設定されており、TransformNodeクラスを定義するときに、クラス全体を 8 バイト境界にアラインするために 4 バイトを割り当て、さらに 4 バイトをint「浪費」しているということです。コンパイラの警告は、「無駄な」4 バイトについて伝えています。私が言ったように、あなたはおそらくこれを気にしません。

一般に、最大の警告とエラーとしての警告をオンにすると、気が狂うだけだと思います。本当にきれいにしたい場合は、警告のレベルを1つ下げてからエラーとして扱う方がおそらく便利です。

再編集: 最近の編集に照らして回答を明確にしました。

別の考え:クラスに別のものを追加してみて、警告が消えるかどうかを確認してください (#2 が「無駄な」4 バイトを「使い果たす」ため、警告が消えると思いintます)。TransformNodeint

http://en.wikipedia.org/wiki/Data_paddingをチェックして、問題をよりよく理解することもできます。

于 2013-10-06T15:05:03.613 に答える
0

この特定の警告を表示するために、どの警告オプションを有効にしましたか? 私は2つの可能性しか考えていません。

考えられるすべての警告フラグをオンにしないでください。多くの誤検知が発生することになり、そのすべてのノイズにより、本当の警告を見逃すことになります。信号対雑音比が高い警告オプションをオンにしてから、発行されるすべての警告に注意を払います。

于 2013-10-07T13:08:00.667 に答える