Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > sizeof


Автор: Hagrael 2.7.2011, 16:20
Есть код:
Код

int arr[10];
cout << sizeof(arr);

Он выдает "40". Все логично, но как компьютер узнает количество ячеек массива?
Тем более, в этом случае:
Код

char* p="one";
cout << sizeof(p);

Автор: Dem_max 2.7.2011, 19:51
в процессе компиляции уже знает.

Цитата

sizeof(p)

это размер адреса, для 32 битной адресации это 4 байта

Автор: Hagrael 3.7.2011, 09:59
Цитата(Dem_max @  2.7.2011,  19:51 Найти цитируемый пост)
в процессе компиляции уже знает.

Т. е. гипотетически вместо функции sizeof(variable) во время компиляции подставляется array_size * array_length?

Автор: Dem_max 3.7.2011, 12:01
угу, если конечно у тебя это
array_size  - размерность типа данных
array_length - количество элементов в массиве.

Автор: volatile 3.7.2011, 12:10
Цитата(Hagrael @  3.7.2011,  09:59 Найти цитируемый пост)
вместо функции sizeof(variable)

Вообще-то sizeof это не функция, формально это оператор. 
все sizeof'ы заменяются компилятором на числа, которые подставляются во время компиляции.
sizeof - означает размер <чего либо> в чарах.



Автор: volatile 3.7.2011, 12:31
Цитата(Hagrael @  2.7.2011,  16:20 Найти цитируемый пост)
int arr[10];
cout << sizeof(arr);

Кстати, еще один пример что это не функция.
с переменными (но не с типами) можно писать так:
cout << sizeof arr;
т.е. без скобок.
если же тип, то скобки обязательны
cout << sizeof(int);

Автор: Hagrael 3.7.2011, 13:49
Разобрался! Большое спасибо, Dem_max и volatile!

Автор: Сыроежка 3.7.2011, 15:41
Цитата(volatile @  3.7.2011,  12:10 Найти цитируемый пост)
Вообще-то sizeof это не функция, формально это оператор. 
все sizeof'ы заменяются компилятором на числа, которые подставляются во время компиляции.
sizeof - означает размер <чего либо> в чарах.


Это не совсем так. Для массивов переменной длины в языке С sizeof вычисляется во время выполнения программы.

Автор: Dem_max 3.7.2011, 17:42
Цитата

Это не совсем так. Для массивов переменной длины в языке С sizeof вычисляется во время выполнения программы.

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

Автор: mes 3.7.2011, 17:58
Цитата(Dem_max @  3.7.2011,  16:42 Найти цитируемый пост)
Это неверно, sizeof всегда вычисляется на стадии компиляции. 

это так в C++ , а в С имеются еще массивы переменной длины, которые  также нуждаются в sizeof'е, но не могут знать свой размер на стадии компиляции.. 
http://liveworkspace.org/code/2969fc76b137ae4d29fee9d917170e30

Автор: Сыроежка 3.7.2011, 18:04
Цитата(Dem_max @  3.7.2011,  17:42 Найти цитируемый пост)
Это неверно, sizeof всегда вычисляется на стадии компиляции


И как вы собираетесь вычислить размер массива в следующем примере на этапе компиляции?!!!

Код

void f( size_t n )
{
   int a[n];
}

Автор: Dem_max 3.7.2011, 18:13
хотя да - это исключение из правил стандарта С99

Автор: Hagrael 4.7.2011, 06:25
Появился еще один вопрос, который я получил после изучения оператора sizeof: При передаче массива в функцию массив принимается как указатель, а можно ли сделать так, чтобы он копировался? (не копировать вручную, а какой-нибудь префикс поставить)

Автор: volatile 4.7.2011, 06:49
Hagrael, простой массив просто так нельзя скопировать. Для этого нужно писать код, просто префиксом не обойтись.
Если нужно копировать, при передаче в функцию, лучше применять STL-овские массивы.

Добавлено через 1 минуту и 55 секунд
Цитата(Сыроежка @  3.7.2011,  15:41 Найти цитируемый пост)
Для массивов переменной длины в языке С 

Не понятно, причем здесь вообще С. 
Или в С уже появился cout  smile 
Цитата(Hagrael @  2.7.2011,  16:20 Найти цитируемый пост)
int arr[10];
cout << sizeof(arr);


Автор: xvr 4.7.2011, 13:20
Цитата(Hagrael @  4.7.2011,  06:25 Найти цитируемый пост)
а можно ли сделать так, чтобы он копировался?

Нет, но можно завернуть его в структуру и передать:
Код

int array[10];
call(array); // No copy of array will be crerated

struct A {
 int array[10];
};

A a;
call(a); // Call by value - whole A will be duplicated, including 'array'


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)