В недавнем интервью о выравнивании структурных структур C++ и теоретизировали, что C и C++ следуют той же стратегии в структурированной упаковке.C vs C++ struct alignment
Hovewer, это было неправильное предположение. Интервьюер сказал, что в целом C и C++ упаковывают структуры по-разному, и мы никогда не должны ожидать противоположного. ИМХО это странное заявление. Существует не pack "C"
квалификатор для структур в C++ для использования в двуязычных заголовочных файлах C/C++.
Так на практике это может означать, что вы не можете создать структуру на C++ и передать ее в библиотеку C, потому что в целом ее поля будут выровнены по-другому и будут иметь разные смещения. Но на самом деле большинство программистов серьезно полагаются на эту интероперабельность до такой степени, что конвертируют указатель на структуру C POD в ссылку на обертку C++ вокруг этой структуры с помощью некоторых вспомогательных методов. Не могли бы вы прояснить этот вопрос?
Какой странный вопрос. Если бы структура отступов отличалась между C и C++, я был бы прикручен.Возможно, интервьюер нашел какой-то действительно странный прием на каком-то неясном компиляторе - или, может быть, он думал, что компиляторы C и C++ могут быть совершенно разными, и ожидая, что два компилятора будут выравнивать поля одинаково с одинаковым дополнением, возможно, не то, уверенно полагаться (но это будет справедливо даже между двумя компиляторами C или двумя компиляторами на C++ - имеет мало общего с языком). –
Вы правы. Упаковка - это деталь реализации процессора, она обеспечивает соблюдение правил выравнивания. Компилятор C и компилятор C++, предназначенные для одного и того же процессора, должны иметь дело с одной и той же деталью реализации. –
Выравнивание структуры определяется на уровне компилятора и зависит от архитектуры процессора. Компиляторы больше всего похожи на совместимые выравнивания в одном наборе (GCC, Clang/LLVM) из-за требований ABI, но могут иметь разные правила между собой. – myaut