LINUX.ORG.RU

типы в c

 ,


1

3

есть такая структурка:

struct x { int i; ... char buf[4096 - ???]; };

проблема в размере buf. должно быть так:

static_assert(sizeof(struct x) == 4096);

как написать там нужный размер без боли? очевидный вариант не проходит:

struct x { int i; ... char buf[4096 - offsetof(struct x, buf)]; }; // struct x is incomplete
struct x { struct { int i; ... } y; char buf[4096 - sizeof(y)]; }; // y is undeclared
struct x { struct y { int i; ... } y; char buf[4096 - sizeof(struct y)]; }; //это работает, но как и в предыдущем случае нужно будет писать x.y.i вместо x.i

лучшее, что придумал:

struct x { union { struct { int i; ... char buf[]; }; char _[4096]; }; };

но хочется иметь простой sizeof(buf), а не костылями. есть ли способ?



Последнее исправление: jsforever (всего исправлений: 2)
Ответ на: комментарий от jsforever

не относится к моему вопросу

struct alignas(4096)  X{
    int i;
    float f;
    char buf[];
};


А теперь?

PS. Но оглашусь, «решение» так себе ;-)

bormant ★★★★★
()
Последнее исправление: bormant (всего исправлений: 1)
Ответ на: комментарий от jsforever

чем мне это должно помочь?

Тем, что struct X — завершенное определение структуры, buf[] — последнее поле этой структуры, имеющее неполный тип, но это допустимо (flexible array member), sizeof struct X == 4096, размер buf[] константно вычислим сразу после завершения объявления типа.

6.7.2.1 Structure and union specifiers
20 As a special case, the last member of a structure with more than one named member may have an incomplete array type; this is called a flexible array member. In most situations, the flexible array member is ignored. In particular, the size of the structure is as if the flexible array member were omitted except that it may have more trailing padding than the omission would imply. However, when a . (or ->) operator has a left operand that is (a pointer to) a structure with a flexible array member and the right operand names that member, it behaves as if that member were replaced with the longest array (with the same element type) that would not make the structure larger than the object being accessed; the offset of the array shall remain that of the flexible array member, even if this would differ from that of the replacement array. If this array would have no elements, it behaves as if it had one element but the behavior is undefined if any attempt is made to access that element
or to generate a pointer one past it.



Неудобства наступают позже, из-за того, что структура всегда выравнивается на 4096, а не имеет размер 4096 и выравнивается на 4, 8, 16 байт.

bormant ★★★★★
()
Ответ на: комментарий от bormant

константно вычислим сразу после завершения объявления типа

и зачем мне это, когда вариант с макроснёй лучше по всем параметрам, а вариант с юнион не хуже? ты решил сделать вид, что я чего-то не знаю и ты мне сейчас объяснишь? наивная идея.

jsforever
() автор топика
Ответ на: комментарий от jsforever

Я же Вам объяснил - по существу с Вами говорить не о чем, но глумиться можно. Но Вы даже такой простой вещи осознать не в состоянии…

А уж дойти до того что большинство решений сломается из за выравнивания Вы точно не способны.

обделаться в споре

Настало время афигительных историй!

AntonI ★★★★★
()
Ответ на: комментарий от AntonI

Настало время афигительных историй!

ну да, ведь это победитель бегает за проигравшим и пытается сохранить лицо, а не наоборот. главное не перепутать.

и да, очередные афигительные истории рядом. что имеем - гуманитарий сел в лужу на всех вопросах, по которым он пытался со мной спорить. далее, когда он осознал своё положение, что он делает? правильно, декларирует «я буду глумится над тобой» - т. е. он будет пытаться мне гадить и мстить за свою некомпетентность.

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

была бы у него возможность устранить меня физически - мы бы уже наблюдали попытки. но поскольку возможности нет, он ограничивается доступными средствами и типа ничего плохого не делает. только вот немногие способны осознать разницу между «не сделал, потому что не хотел» и «не сделал, потому что не смог». первый случай - нормально, второй - максимально убогий. такие дела.

jsforever
() автор топика
Ответ на: комментарий от AntonI

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

PhD
()
Ответ на: комментарий от PhD

Бггг, то есть с одной стороны Вы тщательно следите за всеми техническими тредами где я что то пишу, а с другой стороны принципиально не читаете то что я пишу? Вы каких наук PhD, часом не теологических?

Что то с логикой у Вас беда-беда прям какая то…

AntonI ★★★★★
()
Ответ на: комментарий от AntonI

не теологических?

Что то с логикой

У теологов логика идёт первым предметом. В отличие всяких физиков, которые по получении диплома импликацию от конъюнкции отличить не могут.

LamerOk ★★★★★
()