2016-08-19 11 views
3

Является ли точная компоновка структур D определенными? То есть, точное смещение каждого члена определяется и независимым от компилятора способом? Это означало бы, что компилятор, к счастью или к сожалению, в зависимости от ваших потребностей, будет запрещен переупорядочивать поля, чтобы получить оптимальную упаковку меньших предметов и минимизировать все смещения.Является ли точная компоновка D структур определена?

ответ

5

Это действительно незаконно для компилятора D, чтобы переупорядочить элементы структуры (хотя это может для классов). Важно, чтобы компилятор не перегруппировал элементы для структур, потому что предполагается, что структуры могут использоваться для низкоуровневых материалов, требующих определенных макетов памяти. Также необходимо, чтобы структуры должны были взаимодействовать с кодом C, поэтому они должны соответствовать тому, что вы получили бы в C (по крайней мере, когда используется extern(C)). Таким образом, структуры определенно не перегруппируют своих членов. Кроме того, вы можете указать выравнивание элементов через align attribute, чтобы вы могли полностью контролировать структуру структуры.

Теперь макет по умолчанию может отличаться в зависимости от архитектуры (например, 64-разрядные указатели занимают больше места, чем 32-разрядные указатели, что повлияет на то, как элементы структуры будут упакованы), но оно должно соответствовать тому, что вы получаете C на этой архитектуре.

+0

большое спасибо за это полезное и ясное сообщение –

+0

Означает ли это, что компилятор D для любой архитектуры, где неправильно подобранные данные, такие как нечетные адреса слов, являются незаконными (например, M68000, PDP-11?), однобайтовые выборки или магазины? –

+0

@CecilWard AFAIK, нет компилятора D в настоящее время поддерживает такую ​​архитектуру, и хотя официальная спецификация имеет много хорошей информации, все же слишком часто случается, что то, что делает эталонный компилятор, является эффектом spec (и dmd - только x86/x86_64) , Итак, если проблема не возникла для gdc или ldc, она, вероятно, даже не обсуждалась. Я ожидаю, что ответ заключается в том, что компилятор D будет делать все, что сделал соответствующий компилятор C, но я не знаю. –