LINUX.ORG.RU

Размещение глобальных данных

 ,


0

1

Пример:

int x;
double y;
struct { char zs[256]; } z;

int main() {}

Регламентирует ли стандарт C(или C++) размещение x/y/z? Порядок, выравнивание и подобное. Если есть инфа по реализациям(гцц/шланг) - тоже интересно. Вариант просто собрать посмотреть не подойдёт - нужна какая-то стабильность/гарантии, а не просто текущее положение дел.

Ответ на: комментарий от no-such-file

аппаратно-независимым образом разумеется. потому что даже на одном физическом компутере оптимальное представление данных может радикально отличаться. например, если он работает в 32 битном или 64 битном режиме.

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

аппаратно-независимым образом разумеется

Ну так этот аппаратно-независимый способ выравнивания/упаковки структур как бы должен быть предусмотрен в языке.

no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

Ну так этот аппаратно-независимый способ выравнивания/упаковки структур как бы должен быть предусмотрен в языке.

Нет, не должен.

И как потом сохранять бинарные данные для обмена?

Любым удобным тебе способом.

Вот тебе аналогия: книга может быть напечатана любым шрифтом и цвет обложки тоже любой может быть, но ты можешь прочитать, понять и воспользоваться информацией как тебе нужно.

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

Нет, не должен.

но возможности для реализации такового предоставляет. А как именно должна быть построена логика — все конвенционально для конкретной программы...

safocl ★★
()
Ответ на: комментарий от no-such-file

выравнивание возникает потому, что контроллер памяти читает 64 битное слово за один цикл чтения только с адреса кратному 8 байтам. а 32 битное - с кратного 4 байтам. итак далее. если будет некратно, то будет два цикла чтения. вот чтобы этого не было, компилятор так рассчитывает адреса и смещения, чтобы слова попадали на нужные границы. иначе чтение/запись будут медленней.

если бы память читалась одним чтением n-байтового слова с любого адреса - то и выравнивание было бы не нужно.

короче «аппаратно-независимое выравнивание» - это вообще никакого выравнивания. выравнивание необходимо по чисто техническим причинам.

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

короче «аппаратно-независимое выравнивание» - это вообще никакого выравнивания

В том числе.

выравнивание необходимо по чисто техническим причинам

Этих причин гораздо больше чем ты знаешь. Бывает нужно выравнивание больше чем ширина слова. А бывает что не нужно вообще, несмотря на возникающие дополнительные циклы чтения. Короче, произвольное управление выравниванием необходимо, и поэтому во всех актуальных компиляторах оно так или иначе есть.

no-such-file ★★★★★
()
Ответ на: комментарий от safocl

Нет, не должен.

но возможности для реализации такового предоставляет. А как именно должна быть построена логика — все конвенционально для конкретной программы…

Совершенно верно. Что компилятор действительно «должен», так это сгенерировать инструкции по чтению/записи переменных в памяти. Пытаться угадать как и где он их расположил – печалащий дилетантизм.

Если нужна (де)сериализация или сопряжение разного железа, то и делается это самостоятельно. Чаще всего готовой библиотекой, конечно. Но требовать такой возможности в самом языке – только демонстрировать полное отсутствие понимания какое бывает разное железо и как оно работает.

anonymous
()
Ответ на: комментарий от no-such-file

Бывает нужно выравнивание больше чем ширина слова.

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

alysnix ★★★
()