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

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

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

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

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

Date: 2019-07-12 03:50 pm (UTC)
From: [personal profile] cross_join
POD, POJO, POCO и т.д. есть практически везде, где есть ООП (классы и объекты), и стандартный способ обмена ими - упаковка и распаковка.
В Си++ у стрктуры-класса будет дефолтные конструктор и деструктор, создавать их надо через new (или на стеке). В Си у структуры нет никаких деструкторов, создавать их надо через malloc.

Date: 2019-07-12 07:08 pm (UTC)
yurikhan: (Default)
From: [personal profile] yurikhan
В C++ официально допустимый способ обмена POD’ами — memcpy из байтового буфера. На практике, никаких носодемонов не вылетает и при reinterpret_cast’е указателя на байтовый буфер в указатель на POD-структуру, если при этом не нарушаются требования выравнивания.

Date: 2019-07-15 08:03 am (UTC)
From: [personal profile] cross_join
В Си++ или в связке с Си?
Это часть стандарта?

Date: 2019-07-15 12:31 pm (UTC)
yurikhan: (Default)
From: [personal profile] yurikhan

Что значит «в связке с Си»? Стандарты C и C++ не специфицируют точное представление типов, оставляя это на откуп реализации. Реализации же в большинстве своём делают в соответствии с ABI платформы. Раскладывать плюсовую структуру совместимо с аналогичной сишной — в большинстве случаев достаточно экономично по памяти и быстродействию и выгодно для interoperability.

Плюсовые структуры, удовлетворяющие требованиям на plain old data (C++11 [class]#6–10), будучи побайтово скопированы в байтовый буфер, а затем обратно в память, занятую экземпляром той же самой структуры — остаются валидными объектами, почленно равными исходным (C++11 [basic.types]#2). Указатель на POD-структуру численно равен указателю на её первое поле (C++11 [class.mem]#17–20). Да, здесь нет явного разрешения копировать полученный извне байтовый массив в underlying bytes структуры и рассчитывать на правильную интерпретацию; это, на самом деле, к ABI.

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 04:32 pm
Powered by Dreamwidth Studios