LINUX.ORG.RU

зависит от компилятора long double может быть 10 а может быть 8 байт.
вообщем sizeof тебя спасет

cpu
()

это я к тому что какому-либо компилятору не проблема генерить sizeof(float) == sizeof(double) == sizeof(long double) в целях оптимизации и закладыватся на точный размер не имеет смысла юзай sizeof()

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

кстати правильно ли я понимаю что если какой-то super-double имеет размер 10 байт, но требования по своему выравниванию на 16 или на 8, то sizeof( этого super-double ) будет равен 16??

имхо sizeof не обязательно скажет правильный размер..

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

> имхо sizeof не обязательно скажет правильный размер..

Естественно, sizeof() скажет _правильный_ размер.
По определению.

Если же ты делаешь struct{} - то да, для выравнивания
между членами структуры могут остаться "дырки" и sizeof(struct xxx)
не будет равна сумме sizeof ее (структуры) членов.
Это нормально.

HTH

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

Нет, неправильно. sizeof (double) скажет размер double.

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

> Естественно, sizeof() скажет _правильный_ размер. По определению.

по какому определению???

Если sizeof( superdouble ) = 10, то массив superdouble arr[N]; будет размещен без дырок -- первый на позиции 0, второй на позиции 10 -- это требование стандарта. А по условию superdouble требует выравнивания на 16 или 8. Вывод -- если разработчик компилятора вменяем то у него будет sizeof( superdouble ) == 16..

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

По вопросу -- конкретно ошибку в моем посте укажи. Если он непонятен то утоЧни Что я имел в виду.

По персоналиям -- извини но ты тупая рабоЧая сила с проштампованными мозгами.

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

> Если sizeof( superdouble ) = 10, то массив superdouble arr[N]; будет размещен без дырок

Да.

> -- первый на позиции 0, второй на позиции 10 -- это требование стандарта.

Именно.

> А по условию superdouble требует выравнивания на 16 или 8.

По какому условию?

> Вывод -- если разработчик компилятора вменяем то у него будет sizeof( superdouble ) == 16..

Нет.

> По персоналиям -- извини но ты тупая рабоЧая сила с проштампованными мозгами.

Да.

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

Да, не думал что мой вопрос вызовет такую бурю эмоций у зрителей...

Постараюсь переформулировать.... Как будет уложен массив из float'ов скажем на AMD64? Что будет на выходе из

float a[] = {1, 2, 3, 4} .... fwrite(a, sizeof(float), 4, stdout);

???

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

> > А по условию superdouble требует выравнивания на 16 или 8.

> По какому условию?

для меня все наЧалось с того Что кто-то посоветовал автору темы определять размер плаваЮщего типа по sizeof На это я высказал предположение Что sizeof не обязан быть равен размеру типа в обыЧном понимании

и привел пример -- я не большой знаток архитектур и не знаЮ реализуется ли он на самом деле где-то, но вполне реально представить себе 10-байтовый long double тип требуЮщий 16-байтового выравнивания -- в этом слуЧае и полуЧается Что просто для того Чтобы компилятор поддерживал стандарт Си нужно Чтобы sizeof этого типа был 16

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

> Как будет уложен массив из float'ов скажем на AMD64?

есть стандарт ieee-754 описываЮщий═бинарные форматы, но он по-моему все равно не утоЧняет как именно разложены биты в памяти. а во вторых никто не сказал Что float это именно single плаваЮщий тип из ieee754.

общераспространенное мнение вроде Что единственный портабельный способ это fprintf..

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

Ба народ у вас почем привязаность к 8 и 16 это от понятия 2^Х А 4 байтному процесору накакть у него нету даже 8 Так же как и 10 байтному и ничего там выравнивать не надо будет так как 16 байт отсутствует как класс... Там и память распредилится как слово длиной 10 байт, без выравнивания на 8 или 16.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.