1

Тема: Розмір інстанса порожньої структури

Чому розмір інстанса порожньої структури є не 0 ?

#include <stdio.h>

typedef struct { } empty_t;

int main() {
    printf("Size of type:     %lu\r\n", sizeof(typeof(empty_t))); // 0
    printf("Size of instance: %lu\r\n", sizeof(empty_t()));       // 1
    printf("Size of array:    %lu\r\n", sizeof(empty_t[0x10]));   // 0
    return 0;
}

Я поки не знаю як до цього ставитися.

2

Re: Розмір інстанса порожньої структури

empty_t() - це не інстанс empty_t.

Подякували: leofun011

3

Re: Розмір інстанса порожньої структури

Я взагалі не можу зрозуміти, чому sizeof(int()) не лається на помилку, а повертає ту ж одиницю.

Подякували: Tarpan87, leofun012

4

Re: Розмір інстанса порожньої структури

koala написав:

empty_t() - це не інстанс empty_t.

Точно. Так довго сидів на плюсах, що в мене вже сіпіпі головного мозку.

5

Re: Розмір інстанса порожньої структури

Чудово, але ще це тоді?

6

Re: Розмір інстанса порожньої структури

О, підказали. int () - це сигнатура функції. Чому sizeof(printf) дає 1 - вже інше питання, але принаймні зрозуміло тепер, що відбувається.

Подякували: leofun011

7

Re: Розмір інстанса порожньої структури

koala написав:

Чудово, але ще це тоді?

void ?

printf("Size of {}     : %lu\r\n", sizeof( {}     )); // 1
printf("Size of void   : %lu\r\n", sizeof( void   )); // 1
printf("Size of void() : %lu\r\n", sizeof( void() )); // 1
printf("Size of typeof( ({})       ) : %lu\r\n", sizeof( typeof( ({})       ) )); // 1
printf("Size of typeof( empty_t()  ) : %lu\r\n", sizeof( typeof( empty_t()  ) )); // 1
printf("Size of typeof( struct{}() ) : %lu\r\n", sizeof( typeof( struct{}() ) )); // 1

8

Re: Розмір інстанса порожньої структури

sizeof(typeof(empty_t))
ISO/IEC 9899:2023 N3096/6.7.2.1 написав:

10. [...] If the member declaration list does not contain any named members, either directly or via an anonymous structure or anonymous union, the behavior is undefined.

-------------------

sizeof( empty_t() )

Most vexing parse. І це UB.

sizeof(empty_t[0x10])

Це теж UB.

koala написав:

О, підказали. int () - це сигнатура функції.

ChatGPT?

Подякували: leofun011

9 Востаннє редагувалося Droid 77 (16.02.2024 22:15:22)

Re: Розмір інстанса порожньої структури

leofun01 написав:

Чому розмір інстанса порожньої структури є не 0 ?

#include <stdio.h>

typedef struct { } empty_t;

int main() {
    printf("Size of type:     %lu\r\n", sizeof(typeof(empty_t))); // 0
    printf("Size of instance: %lu\r\n", sizeof(empty_t()));       // 1
    printf("Size of array:    %lu\r\n", sizeof(empty_t[0x10]));   // 0
    return 0;
}

Я поки не знаю як до цього ставитися.

Компілятор який, і який стандарт мови?
І що є в структурі empty_t?

10 Востаннє редагувалося Droid 77 (16.02.2024 22:33:17)

Re: Розмір інстанса порожньої структури

wander написав:
sizeof(typeof(empty_t))
ISO/IEC 9899:2023 N3096/6.7.2.1 написав:

10. [...] If the member declaration list does not contain any named members, either directly or via an anonymous structure or anonymous union, the behavior is undefined.

-------------------

sizeof( empty_t() )

Most vexing parse. І це UB.

sizeof(empty_t[0x10])

Це теж UB.

koala написав:

О, підказали. int () - це сигнатура функції.

ChatGPT?

C++ shell на 6-му та 7-му рядках хрести розмістив.

Текст помилок
main.cpp:7:55: error: unexpected type name 'empty_t': expected expression
    printf("Size of type:     %lu\r\n", sizeof(typeof(empty_t))); // 0
                                                      ^
main.cpp:8:41: error: invalid application of 'sizeof' to a function type
    printf("Size of instance: %lu\r\n", sizeof(empty_t()));       // 1
                                        ^     ~~~~~~~~~~~
2 errors generated.
Подякували: leofun011

11

Re: Розмір інстанса порожньої структури

Droid 77 написав:

C++

Ви розділ в якому створити тему бачили?

Droid 77 написав:

І що є в структурі empty_t?

*DONT_KNOW*

Подякували: leofun011

12

Re: Розмір інстанса порожньої структури

*DONT_KNOW*
І що?

13

Re: Розмір інстанса порожньої структури

Droid 77 написав:

Компілятор який...?

Пхай код туди: OnlineGDB (C compiler).

Droid 77 написав:

який стандарт мови?

C99

Droid 77 написав:

І що є в структурі empty_t?

Загалом я відстойуйу позицію, програміст не мусить знати англійську. Але як можна було не побачити цитований код ?

typedef struct { } empty_t;

*SCRATCH*

В будь-якому випадку, на поставлені тут питаня відповіді я отримав, топік можна вважати закритим.

14

Re: Розмір інстанса порожньої структури

Хм. UB UB-ою, але раніше вода була мокріша принаймні якась послідовність була.
Десь ще вимога, що різні об'єкти повинні мати різні адреси.
Тому я пам'ятаю порожня структура займала один байт в тому числі у масиві.
А зараз бачу таке

int a1[0];
int a2[0];
int aa[2][0];

struct empty_s { };

struct empty_s s1;
struct empty_s s2;
struct empty_s sa1[2];

тиць

Одиничні порожні масиви і структури мають різні адреси, а в масиві однакові.

&a1     = 0x557aea5de020, sizeof(a1) = 0
&a2     = 0x557aea5de01c, sizeof(a2) = 0
&aa     = 0x557aea5de018, sizeof(aa) = 0
&aa[0]  = 0x557aea5de018, sizeof(aa[0]) = 0
&aa[1]  = 0x557aea5de018, sizeof(aa[1]) = 0
&s1     = 0x557aea5de016, sizeof(s1) = 0
&s2     = 0x557aea5de015, sizeof(s2) = 0
&sa1    = 0x557aea5de014, sizeof(sa1) = 0
&sa1[0] = 0x557aea5de014, sizeof(sa1[0]) = 0
&sa1[1] = 0x557aea5de014, sizeof(sa1[1]) = 0

Ну в масиві хоч якась послідовність зберігається — перехід до наступного елемента це зміщення байтової адреси на sizeof(елемент)  ;)

Подякували: leofun011

15

Re: Розмір інстанса порожньої структури

Це, схоже, сильно може залежати від компілятора до компілятора, адже якщо ми пропишемо ключик -pedantic, то отримаємо:

<source>:1:9: warning: struct has no members [-Wpedantic]
    1 | typedef struct { } empty_t;
      |         ^~~~~~
<source>:1:9: warning: empty struct is a GNU extension [-Wgnu-empty-struct]
    1 | typedef struct { } empty_t;
      |         ^

Тобто, це GNU extension, яке дозволяє структурі не мати членів. Цікаво саме те, що вони буквально дозволяють мати пусту структуру, а не як у С++. Чому, в цьому випадку, вони таке дозволили, а не вирішили всунути туди якийсь char - питання хороше.

Подальші тестування просто не мають сенсу, оскільки згідно зі стандартом - це UB, а компілятори тут можуть робити будь-що.

Подякували: leofun01, ReAl2