это я к тому что какому-либо компилятору не проблема генерить sizeof(float) == sizeof(double) == sizeof(long double) в целях оптимизации и закладыватся на точный размер не имеет смысла юзай sizeof()
кстати правильно ли я понимаю что если какой-то super-double имеет размер 10 байт, но требования по своему выравниванию на 16 или на 8, то sizeof( этого super-double ) будет равен 16??
имхо sizeof не обязательно скажет правильный размер..
> имхо sizeof не обязательно скажет правильный размер..
Естественно, sizeof() скажет _правильный_ размер.
По определению.
Если же ты делаешь struct{} - то да, для выравнивания
между членами структуры могут остаться "дырки" и sizeof(struct xxx)
не будет равна сумме sizeof ее (структуры) членов.
Это нормально.
> Естественно, sizeof() скажет _правильный_ размер. По определению.
по какому определению???
Если sizeof( superdouble ) = 10, то массив superdouble arr[N]; будет размещен без дырок -- первый на позиции 0, второй на позиции 10 -- это требование стандарта. А по условию superdouble требует выравнивания на 16 или 8. Вывод -- если разработчик компилятора вменяем то у него будет sizeof( superdouble ) == 16..
> > А по условию superdouble требует выравнивания на 16 или 8.
> По какому условию?
для меня все наЧалось с того Что кто-то посоветовал автору темы определять размер плаваЮщего типа по sizeof На это я высказал предположение Что sizeof не обязан быть равен размеру типа в обыЧном понимании
и привел пример -- я не большой знаток архитектур и не знаЮ реализуется ли он на самом деле где-то, но вполне реально представить себе 10-байтовый long double тип требуЮщий 16-байтового выравнивания -- в этом слуЧае и полуЧается Что просто для того Чтобы компилятор поддерживал стандарт Си нужно Чтобы sizeof этого типа был 16
> Как будет уложен массив из float'ов скажем на AMD64?
есть стандарт ieee-754 описываЮщий═бинарные форматы, но он по-моему все равно не утоЧняет как именно разложены биты в памяти. а во вторых никто не сказал Что float это именно single плаваЮщий тип из ieee754.
общераспространенное мнение вроде Что единственный портабельный способ это fprintf..
Ба народ у вас почем привязаность к 8 и 16 это от понятия 2^Х А 4 байтному процесору накакть у него нету даже 8 Так же как и 10 байтному и ничего там выравнивать не надо будет так как 16 байт отсутствует как класс... Там и память распредилится как слово длиной 10 байт, без выравнивания на 8 или 16.