beldmit: (Программизм)
[personal profile] beldmit
Наступил на грабли. gcc и g++ дают разный размер довольно развесистой структуры, используемой в сишной и плюсовой библиотеках.

Можно ли малой кровью их привести к единому знаменателю? С-шная библиотека не наша, плюсовая наша.

Вроде бы везде стоят флаги
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

Опцию -fpack-struct пробовал, не преуспел.

Update: разные опции сборки базовой и производной библиотек.

Date: 2019-07-11 09:49 pm (UTC)
From: [personal profile] being_no_one
Опасный фокус даже в этом примере. Если бы размер int был 8 байт, то аналогично реализованный get_c содержал бы UB, ибо *((double*)(p + 12)) нарушает требования к выравниванию для double; при попытке поступить так с действительно большой структурой шанс наступания на эти грабли опасно высок.
Edited Date: 2019-07-11 09:51 pm (UTC)

Date: 2019-07-12 06:51 am (UTC)
elglin: (Default)
From: [personal profile] elglin
Без фигни опасный, а еще int разный на разных архитектурах. Тут для стабильности надо структуру делать кратной 64 битам (то есть не char[], а int64_t[]), молиться, что этот кусок кода выкинут до перехода на 128-битовое слово, и все равно при такой указательной магии есть шанс отстрелить себе ногу.
Мой научник 20 лет назад поминал идею о том, что иногда стоит сделать конский malloc(), а дальше внутри него раскладывать то, что тебе нужно, по сути, реализуя свой маленький менеджер памяти. Это вот ровно то же самое; подозреваю, это до сих пор верно в ситуациях, когда у тебя 64К памяти, и ты реально лучше любого компилятора знаешь, что где как должно лежать.

Profile

beldmit: (Default)
Dmitry Belyavskiy

December 2025

S M T W T F S
 123456
78910111213
14151617181920
2122 2324252627
28293031   

Most Popular Tags

Page Summary

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 28th, 2025 08:43 am
Powered by Dreamwidth Studios