встроенные функции, возвращающие неверные результаты - PullRequest
3 голосов
/ 09 февраля 2011

У меня есть большое приложение, над которым я работаю в C ++, и у нас есть класс, в котором встроенные функции возвращают неправильное значение.Похоже, они смещены на одну запись.

Вот пример того, как устанавливается код:

class Test
{

private:
    uint myVal1;    
    uint myVal2;
    uint myVal3;
    uint myVal4;

public:
    uint myFunct1() const { return myVal1 };
    uint myFunct2() const { return myVal2 };
};

Мы видим, что myFunct1 возвращает myVal2, а myFunct2 возвращает myVal3,Если я не сделаю функции встроенными, все будет работать как положено.

Есть идеи, почему это происходит?

Заранее спасибо.

Ответы [ 2 ]

11 голосов
/ 09 февраля 2011

(я предполагаю, что то, что вы разместили выше, на самом деле является фрагментом из какого-то заголовочного файла.)

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

Как только вы начнете передавать Test объекты между этими единицами перевода, проблема обнаружится. Один модуль перевода создает объект Test с одним макетом памяти, затем другой модуль перевода читает его или записывает в него, предполагая совершенно другую структуру памяти. В вашем случае именно ваши встроенные функции интерпретируются по-разному в каждой единице перевода.

Если вы определите свои функции-члены как не встроенные, они примут макет памяти класса, специфичный для исходного файла, в котором они определены. Это сместит проблему под ковер и заставит все «работать» (поскольку функции доступа теперь привязаны к одному макету памяти), но, тем не менее, это не очень хорошая ситуация. Это все еще может привести к различным проблемам подобного характера в будущем.

Убедитесь, что все исходные файлы в вашей программе скомпилированы с точно такими же настройками макета памяти классов.

PS Как отметил Фред в комментариях, расхождение в разметке памяти классов между единицами перевода может быть вызвано чем-то столь прозаичным, как забывание перекомпилировать исходный файл после изменения заголовочного файла, от которого зависит исходный файл на.

Другим «популярным» источником таких проблем являются определения классов, которые зависят от директив препроцессора (то есть макет класса «настраивается» сегментами #ifdef / #endif). Если вы забудете #define что-то важное в каком-то исходном файле, который включает в себя ваш заголовочный файл, вы можете получить другую схему памяти для класса в этом исходном файле.

3 голосов
/ 09 февраля 2011

Нет, встроенные функции (конечно) должны иметь те же результаты, что и не встроенные функции. Итак, проблема должна быть в другом месте, в коде, который вы не показываете. Возможно, тот, кто магически устанавливает значения приватных членов?

...