LINUX.ORG.RU

Как ты представляешь себе sizeof в роли функции?
Что она принимает на вход, как работает?

Love5an
()

а ты можешь предложить реализацию sizeof в виде функции?

jtootf ★★★★★
()

Ясна короче, просто выглядит он то обособленно от остальных операторов, как функция, вот я и засомневался.

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

>а ты можешь предложить реализацию sizeof в виде функции?

я не разбираюсь в вопросе, мне лишь интересно, а нельзя через указатели получить адрес начальной ячейкм памяти и последней, подсчитать количество ячеек между ними?

pseudo-cat ★★★
()
Ответ на: комментарий от Turbid

> Ясна короче, просто выглядит он то обособленно от остальных операторов, как функция, вот я и засомневался.

его без скобок кстати можно использовать.

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

> я не разбираюсь в вопросе, мне лишь интересно, а нельзя через указатели получить адрес начальной ячейкм памяти и последней

задача получения последней ячейки эквивалентна задаче получения sizeof

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

>я не разбираюсь в вопросе, мне лишь интересно, а нельзя через указатели получить адрес начальной ячейкм памяти и последней, подсчитать количество ячеек между ними?
Указатель - просто адрес. 0xfff04353476a

ratatosk
()
Ответ на: комментарий от pseudo-cat

Можно так:

Type arr[2];
int TypeSize = ((char*)(arr + 1) - (char*)arr)

не уверен что это гарантированно совпадёт с sizeof, но в качестве sizeof получившуюся цифру можно использовать.

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

задача получения последней ячейки эквивалентна задаче получения sizeof

а если выделить заранее обнулённую память, снять её состояние, записать обьект, сравнить состояния?

pseudo-cat ★★★
()
Ответ на: комментарий от Legioner

>не уверен что это гарантированно совпадёт с sizeof, но в качестве sizeof получившуюся цифру можно использовать.

Если компилятор применит выравнивание, твое решение не подойдет

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

или вот так:

template<class T> uint sizeof1() { return sizeof(T); }

template<class T> uint sizeof2(T t) { return sizeof1<T>(); }

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

> не уверен что это гарантированно совпадёт с sizeof

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

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

>я не разбираюсь в вопросе
да, это так.

xydo ★★
()
Ответ на: комментарий от pseudo-cat

>а нельзя через указатели получить адрес начальной ячейкм памяти и последней, подсчитать количество ячеек между ними?

(прикрутил libastral к парсеру)
чисто для справки, как ты получишь адреса в следующем случае:
sizeof(float)
sizeof(struct blahblahblah)
и т.д.

и потом, как ты получишь адрес конечной ячейки?
(можно воспользоваться массивом из двух элементов, как написали выше, но это уже идусятина полная)

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

кстати, там не обязательно 2 элемента — достаточно массива из одного элемента, потому что стандарт говорит что указатель на элемент за концом массива является валидным — с ним можно проводить арифметику и сравнивать.

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

а если так?

int a;
if(sizeof(a) != (size_t)((&a + 1) - &a))
{
printf("OMG o_O U R motherhacker\n");
exit(1);
}

в принципе можно.
остается только вопрос целесообразности)

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

и потом, как ты получишь адрес конечной ячейки?

Слова «адресная арифметика» ни о чем не говорят?

#define size_of(type) ((size_t)((char*)((type*)0+1)-(char*)0))

Об offsetof тоже ничего не слышал?

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

на мой взгляд правильно будет только с массивом T a[1]; а просто с переменной T a; неправильно, потому что указатель на конец переменной не обязан быть валидным, а значит его не только нельзя разыменовывать, но и нельзя делать арифметику, то есть это UB.

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

>Если компилятор применит выравнивание, твое решение не подойдет

Простите, но что в данном контексте обозначает «выравнивание»? Паддинг?

trimm
()

А ещё, sizeof можно писать без скобочек, а ещё он отличает массив от указателя на массив, в общем с функцией проблема...

int a;
char b[10];
cout<<"1:"<<sizeof a<<" 2:"<<sizeof b<<" 3:"<<sizeof &*b<<endl;
$ ./a.out 
1:4 2:10 3:4
gena2x ★★★
()
Ответ на: комментарий от gena2x

> А ещё, sizeof можно писать без скобочек, а ещё он отличает массив от указателя на массив, в общем с функцией проблема...

А ещё аргументом sizeof может быть тип. В плюсах такое со страшным скрипом ещё можно изобразить в виде функции, а в сях совсем никак.

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

А вот получить размер куска памяти, выделенного под указателем похоже никак нельзя... То есть free()-то знает сколько там освобождать, но средствами языка этого не узнать?

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

Кстати, ещё одно интересное (возможно только мне :) ) применение sizeof:

application appl[1] = {{{{(sizeof appl)}}}};

Так в документации на sofia-sip. Понятно, что объявляется массив из одного элемента.. но не очень понятно чем он и почему так инициализируется :)

lv ★★
()

Макрос. Занимательные возможности препроцессора же.

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

Это ты у melkor217 спроси - он, видимо, в курсе. :)
Для меня - довольно загадочная конструкция.

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