Функционирование оператора sizeof () в C ++ - PullRequest
0 голосов
/ 01 октября 2019

Я написал простую программу, чтобы понять функционирование функции стандартной библиотеки c ++ sizeof () .

Из этого следует:

const char* array[] = {
                          "1234",
                          "5678"
                          };

    std::cout << sizeof(array) << std::endl;//16
    std::cout << sizeof (array[0]) << std::endl;//8

    std::cout << printf("%lu\n",sizeof (char) );//1
    std::cout << printf("%lu\n",sizeof (int) );//24
    std::cout << printf("%lu\n",sizeof (float) );//24
    std::cout << printf("%lu",sizeof (double) );//281

По выводу можно видеть, что символы имеют размерность 1 байт в моей ОС, как и ожидалось. Но я не понимаю, почему размерность '' 'array [0]' '' равна 8, так как он содержит 4 символа charcaters и, как минимум, 2 других символа charcaters для конечной последовательности "\ n", которая содержится в строке. Таким образом, я предположил, что число байтов, занимаемых первым элементом массива, должно быть 6, а не 8. Более того, если я увеличу / уменьшу количество символов, содержащихся в первом элементе массива, его размер не изменится. ,Понятно, я не прав. Если кто-то может объяснить мне эту функцию, я был бы очень признателен. Спасибо,

Ответы [ 2 ]

6 голосов
/ 01 октября 2019

Я написал простую программу, чтобы понять функционирование функции стандартной библиотеки c ++ sizeof ().

Неверная терминология. Пожалуйста, прочитайте n3337 (стандарт C ++) и википейдж на sizeof .

sizeof - оператор времени компиляции, не функция . Если v является некоторой переменной, sizeof(v) зависит только от типа из v и никогда от его значения (напротив, для большинства функций f значениеf(v) зависит от значения v).

И хороший способ понять что-то о C ++ - обратиться к документам, таким как стандарты или хорошие веб-страницы об этом.

Если кто-нибудь может мне объяснить

Да. Прочитайте хорошую книгу о C ++. Этот написан главным разработчиком C ++. Попытайтесь понять больше и лучше (трудную) семантику C ++. Вы также можете изучить исходный код существующих компиляторов C ++ с открытым исходным кодом, таких как GCC или Clang / LLVM (таким образом, эффективно используя одно из ваших свободных программ reedoms ).

Кстати, с большой болью вы можете найти реализации C ++ с sizeof(int), равным 1 (например, для некоторых DSP процессоров). На дешевых 32-битных ARM процессорах (например, в дешевых мобильных телефонах сегодня; тогда вы, вероятно, будете использовать кросс-компилятор ) или на некоторых Raspberry Pis (или, возможно, некоторые мэйнфреймы ), у вас может быть sizeof(array[0]) или sizeof(void*), равное 4 даже в 2019 году.

2 голосов
/ 01 октября 2019

Давайте разберем смысл некоторых запутанных выходных значений, которые вы видите!

Во-первых, sizeof(array) и sizeof(array[0]) (где ваш метод вывода в порядке). Вы определили / определили array как массив из двух char* значений, каждое из которых является указателем. Размер указателя в вашей системе составляет 8 байт, поэтому общий размер array составляет: 8 * 2 = 16 . Для массива [0]: это один указатель, поэтому его размер составляет всего 8 байтов.

Имеет ли все это смысл до сих пор? Если это так, то давайте посмотрим на вторую часть вашего кода…

Значения sizeof(char), sizeof(int), sizeof(float) и sizeof(double), в вашей системе , по порядку, 1, 4, 4 и 8. Эти значения фактически выводятся! Однако, так как вы также выводите возвращаемое значение printf(), которое является числом написанных им символов, вы получаете дополнительные значения «2», «2», «2» и «1» (взапутанный и, возможно, неопределенный порядок) для четырех вызовов (последний не имеет новой строки, поэтому это только один символ; все остальные - одна цифра + новая строка = 2 символа).

Изменить вторую частьвашего кода следующим образом, чтобы получить правильные выводы:

printf("%zu\n", sizeof(char));   //1
printf("%zu\n", sizeof(int));    //4
printf("%zu\n", sizeof(float));  //4
printf("%zu\n", sizeof(double)); //8
...