Size: a a a

IT KPI C/C++ ХВ (не UB)

2020 December 09

J

Jmik in IT KPI C/C++ ХВ (не UB)
Alexander Pavlyuchuk
+ гарантию что структура не была силой(тобой) выровняна как-то через жепу
Мне просто надо вернуть двумерный массив

И я хочу чтоб он не был разбросан по памяти (а если делать через
arr** calloc(n, sizeof(int*));
for (....) arr[i] = calloc(m, sizeof(int))
Он же будет разбросан


А так я сделаю массив структур
И массив этих структур будет плотно лежать в памяти
источник

AP

Alexander Pavlyuchuk in IT KPI C/C++ ХВ (не UB)
по факту ты хочешь сделать какую-то дичь вместо старых добрых костылей и работы с одномерным массивом как с двумерным
источник

AP

Alexander Pavlyuchuk in IT KPI C/C++ ХВ (не UB)
типа если надо arr[5][5], то
char *arr = (char *) malloc(sizeof(char) * 5 * 5);
источник

AP

Alexander Pavlyuchuk in IT KPI C/C++ ХВ (не UB)
ну я хз как на сихе принято в таких случаях страдать
источник

AB

Aleksey Belkevich in IT KPI C/C++ ХВ (не UB)
Jmik
Мне просто надо вернуть двумерный массив

И я хочу чтоб он не был разбросан по памяти (а если делать через
arr** calloc(n, sizeof(int*));
for (....) arr[i] = calloc(m, sizeof(int))
Он же будет разбросан


А так я сделаю массив структур
И массив этих структур будет плотно лежать в памяти
Если в итоге ты будешь обращаться к массиву через двойной указатель, там всё равно будет подразумеваться что он "разбросан" по памяти. Так что если у тебя там будет линейно выделенная память, всё закончиться печально
источник

VI

Vladimir Ivanov in IT KPI C/C++ ХВ (не UB)
Jmik
Есть какие-то гарантии размещения данных в структуре?
Типа могу ли я гарантировать что
struct { int a; int b; } foo
И
int bar[2]
Можно спокойно преобразовывать друг в друга?
Нет. Потому что компилятор может добавить сколько угодно паддинга между полями структуры, но не между элементами массива
источник

AP

Alexander Pavlyuchuk in IT KPI C/C++ ХВ (не UB)
Vladimir Ivanov
Нет. Потому что компилятор может добавить сколько угодно паддинга между полями структуры, но не между элементами массива
зачем ему что-то добавлять если выравнивание памяти выключено
источник

AP

Alexander Pavlyuchuk in IT KPI C/C++ ХВ (не UB)
или если типы одинаковы
источник

JC

Julian =) Coffee in IT KPI C/C++ ХВ (не UB)
Alexander Pavlyuchuk
зачем ему что-то добавлять если выравнивание памяти выключено
Ну по приколу)0)
источник

AP

Alexander Pavlyuchuk in IT KPI C/C++ ХВ (не UB)
ну.. если у тебя структура из двух интов, то ты можешь гарантировать что её размер будет равен размеру двух интов
источник

AP

Alexander Pavlyuchuk in IT KPI C/C++ ХВ (не UB)
иначе б sizeof нахуй не нужен был по сути
источник

AP

Alexander Pavlyuchuk in IT KPI C/C++ ХВ (не UB)
раз оно может от балды размеры добавлять
источник

JC

Julian =) Coffee in IT KPI C/C++ ХВ (не UB)
Ну оно в компайлтайме добавило
источник

JC

Julian =) Coffee in IT KPI C/C++ ХВ (не UB)
И посчитало сайз
источник

AP

Alexander Pavlyuchuk in IT KPI C/C++ ХВ (не UB)
я понимаю что это компайлтайм
источник

AP

Alexander Pavlyuchuk in IT KPI C/C++ ХВ (не UB)
я говорю что есть куча логики завязаной на такие вот костыли с памятью
источник

AP

Alexander Pavlyuchuk in IT KPI C/C++ ХВ (не UB)
во всяких дебрях
источник

AP

Alexander Pavlyuchuk in IT KPI C/C++ ХВ (не UB)
если б компилятор мог просто по приколу впиливать паддинги без какого-то смысла, то мне кажется она бы не работала))
источник

JC

Julian =) Coffee in IT KPI C/C++ ХВ (не UB)
Ну вообще можно статик ассерт на сайзоф вставить
источник

AP

Alexander Pavlyuchuk in IT KPI C/C++ ХВ (не UB)
ну типа,
struct A {
char c;
size_t b;
};

тут будет сайзоф 16, потому что падинг нужон
источник