2013-10-06 1 views
3

TransformNode with 4 bytes to alignment boundaryЧто означает ошибка: ... «байты для выравнивания границы» в Xcode/Clang?

А вот код, который вызывает данное предупреждение:

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; 
} 

ошибка происходит, когда я получить Node класс от класса TransformNode. Я использую xcode 5.0 со всеми предупреждениями, включенными и обрабатывающими предупреждения как ошибки. Я действительно хочу понять, что происходит с этим кодом, поэтому просто отключить предупреждения или перестать рассматривать их как ошибки не так, как я хочу справиться с этим.

EDIT: добавлено больше кода. Разъяснение о некоторых деталях (выделены жирным шрифтом)

Спасибо,
Gasim

+2

Опубликовать больше кода. –

+0

Должен ли я добавить больше кода? – Gasim

+0

* Должен ли я добавить больше кода? * ** Да **. Вы все еще не показываете, где вы преобразуете узел в TransformNode. Как мы можем сказать, где вы ошибались, без этой важной части кода? –

ответ

4

Я не уверен, что вы видите на самом деле ошибка. Как правило, «все предупреждения» включают в себя все виды вещей, которые едва считаются предупреждениями; черт, по большей части они даже не супер информативны.

Выравнивание - проблема, о которой вы, вероятно, не заботитесь, если вы не работаете с очень конкретным оборудованием, как во встроенной системе. Вероятно, происходит то, что ваш компилятор по умолчанию использует 8-байтовое выравнивание, а когда вы определяете класс TransformNode, вы выделяете 4 байта для int и «тратите» еще 4 байта, чтобы выровнять весь класс с 8-байтной границей. Предупреждение компилятора сообщает вам о «потерянных» 4 байтах. Как я уже сказал, вам, наверное, все равно.

Я думаю, что в целом вы просто сводите себя с ума, если у вас есть максимальные предупреждения и предупреждения, связанные с ошибками. Вероятно, более полезно отступить на один уровень предупреждения, а затем рассматривать как ошибку, если вы действительно хотите быть супер-чистым.

Reedit: Уточненный ответ в свете недавних изменений.

Еще одна мысль: Попробуйте добавить еще один int в вашем TransformNode классе и посмотреть, если предупреждение уходит (я предполагаю, что это будет, потому что int # 2 будет «использовать» в «впустую» 4 байта).

Вы также можете проверить http://en.wikipedia.org/wiki/Data_padding, чтобы лучше понять проблему.

+0

Это очень много информации. Я добавил еще один 'int', как вы предложили, и на самом деле отобрал предупреждение. Теперь я пытаюсь выяснить, что действительно вызвало это предупреждение в первую очередь :) – Gasim

+0

После того, как я прочитал статью, я понял, что это может быть связано с тем, что я использую 64-битную архитектуру в своей архитектуре. Я изменил его до 32 бит и теперь больше не предупреждаю об этом :) – Gasim

+0

Это имеет смысл. Рад, что это было полезно. – keefer

0

Какой предупреждающий вариант вы позволили получить это конкретное предупреждение? Я вижу только две возможности.

  • -Weverything
    Не указывайте этот параметр. Этот параметр предназначен только для внутреннего использования Clang. См. Первый ответ на этот вопрос на сайте-партнере Programmers, https://softwareengineering.stackexchange.com/questions/122608/clang-warning-flags-for-objective-c-development.
  • -Wpadded
    Если вы специально попросили предупредить насчет заполнения, почему вы задаете этот вопрос?

Не включайте все возможные предупреждающие знаки. В итоге вы получите много ложных срабатываний, и весь этот шум заставит вас пропустить настоящие предупреждения. Включите параметры предупреждения с высоким отношением сигнал/шум, а затем обратите внимание на каждое предупреждение, которое выдается.

+0

Анонимный downvoter: Обоснование для downvote было бы неплохо. Я, например, как использование '-Werror', чтобы сделать предупреждения, стал ошибкой компиляции. Использование '-Weverything' или даже' -Wpadded' в сочетании с '-Werror' является плохой идеей. Это особенно плохая идея, если вы используете другую базу кода, над которой у вас нет контроля. –

Смежные вопросы