C vs C++ выравнивание структуры


меня спросили в недавнем интервью о выравнивании полей структуры C++ и теоретизировали, что C и C++ следуют одной и той же стратегии в упаковке структуры.

однако, это было неправильное предположение. Интервьюер сказал, что в целом C и c++ упаковывают структуры по-разному, и мы никогда не должны ожидать обратного. ИМХО это странное утверждение. Нет никакого pack "C" квалификатор для структур в C++ для использования в двуязычных файлах заголовков C / C++.

Так что на практике это это может означать, что вы не можете создать структуру в C++ и передать ее в библиотеку C, потому что в целом ее поля будут выровнены по-другому и иметь разные смещения. Но, на самом деле, большинство программистов серьезно полагаются на эту совместимость вплоть до того момента, когда они преобразуют указатель в C POD struct для ссылки на оболочку C++ вокруг этой структуры с некоторыми вспомогательными методами. Не могли бы вы прояснить этот вопрос?

3 62

3 ответа:

как стандарты языка C, так и C++ не предъявляют никаких требований к заполнению структуры и оставляют его в качестве детали реализации компилятора. Строгая интерпретация этого означала бы, что нет никакой гарантии, что структура будет одинаковой между ними.

на практике, однако, данная версия инструментальной цепочки, способной как C, так и C++ (например, GCC или Clang), может упаковать идентичную структуру таким же образом, если это необходимо. Без этого много производственного кода в мире просто не сработает. Это гарантия, предоставленная toolchain, однако, и не язык.

стоит отметить, что если бы вы объявили аналогичную структуру оригиналу C, но добавили спецификаторы доступа (private,public и protected), что макет изменится, но это немного растягивается, так как структура больше не идентична.

Это было очевидно неправильно (со стороны интервьюера). Понятно, что структурная упаковка одинакова для C и C++ для всех, кто работал с любым низкоуровневым API работа со структурами - например, сетевой API. Все это функции C, которые принимают структуры "C", но они безопасно вызываются миллионы миллионов раз в день из кода C++.

вам должно быть повезло, что у вас был этот вопрос. Это дает понять, что вы не должны работать там.

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

вот почему они изобрели структуры "POD": структура, которая не использует никаких функций C++, будет вести себя в программе C++ точно так же, как и в программе C (кроме того, что реализация определенного поведения может измениться, так как компилятор C и компилятор C++ явно не являются одной и той же реализацией. С другой стороны, компилятор C++, вероятно, просто скопирует определение реализации из компилятора C).

Если вы берете любую простую структуру C, которая также является допустимой структурой C++ (например, без членов с именем "класс"), а затем просто добавляете "public:" сразу после открытия фигурной скобки, то ее макет, порядок членов, выравнивание и т. д. могут измениться. Даже хотя все члены структуры по умолчанию являются общедоступными,поэтому ничего не изменилось. За исключением того, что из-за "общественности" это больше не стручок.