Зависит ли размер переменной в компиляторе C? - PullRequest
0 голосов
/ 04 сентября 2018

Учитывая следующий код:

void print(int arr[])
{
  int n = sizeof(arr)/sizeof(arr[0]);
  printf("\nSize is  %d",n);
}

int main()
{
    int arr[]={1,2,3,4,5,6};
    print(arr);
    return 0;
}
  • Когда приведенный выше код скомпилирован в GCC 6.3 или более ранней версии, вывод: size is 2.
  • Когда код скомпилирован в компиляторе MinGW, вывод будет Size is 1

Теперь наоборот, мы привыкли изучать, что когда массив передается в качестве аргумента, он передает только базовый адрес массива (, что составляет 4 байта для неявной переменной-указателя и для целочисленной переменной ).

Зависит ли компилятор переменных размеров или я что-то здесь упускаю? Пожалуйста, поправьте меня

Ответы [ 3 ]

0 голосов
/ 04 сентября 2018

Are the variable sizes compiler dependent ? Да, это зависит от компилятора, но это не означает, что архитектурная точка зрения не имеет значения. Кроме того, от архитектуры зависит, является ли она 16/32/64 битной системой, например, для 16-bit машин, sizeof (int) равна 2 байтов, для 32-bit машин она составляет 4 байтов.

Считалось, что int - это собственный размер процессора, то есть размер регистра.

Здесь в аргументе функции arr[] - это указатель, а не массив.

Итак, если система 32 битная система, тогда

sizeof(arr)/sizeof(arr[0]);

приведет к 1 как 4/4 = 1.

Я нахожу комментарии @Eric очень верными и интересными относительно роли компилятора и архитектуры в определении размера переменной.

Размеры типов в конечном итоге определяются реализацией C (особенно компилятор), а не архитектура или операционная система. В то время как реализации C обычно находятся под сильным влиянием архитектура, компьютеры фактически являются универсальными машинами Тьюринга, поэтому что любой желаемый выбор размеров может быть реализован. С реализации иногда выбирают размеры на основе соображений о том, что должен поддерживаться исходный код, а не тот, который наиболее эффективен для архитектура. Они могут даже поддерживать выбор размеров через переключатели командной строки.

0 голосов
/ 04 сентября 2018

Да, размеры типов зависят от реализации. В частности, размер указателя на int и размер int зависят от реализации C (прежде всего компилятора) и могут отличаться друг от друга.

Утверждение в вопросе, содержащееся в «базовом адресе массива (, который составляет 4 байта для неявной переменной-указателя и целочисленной переменной для обоих )», как правило, ложно. Это верно в некоторых реализациях C, но неверно в других.

Код sizeof(arr)/sizeof(arr[0]) внутри функции, объявленной с void print(int arr[]), печатает размер указателя на int, деленный на размер int.

Хотя на реализации C сильно влияют архитектуры и целевые операционные системы, они могут выбирать размеры своих типов по причинам, отличным от скорости выполнения, таким как цели поддержки меньшего использования памяти, поддержки кода, который не был записан в быть полностью переносимым для любых типов шрифтов или поддерживать более простое использование больших целых чисел.

0 голосов
/ 04 сентября 2018

arr[], как параметр функции, является указателем. sizeof(arr)/sizeof(arr[0]); - это размер указателя / размер int. Массивы не задействованы.

Зависит ли размер переменной в компиляторе C?

Да, int может быть 32-разрядным, 16-разрядным и т. Д. 1 (должно быть не менее 16)

Указатель объекта может быть 16-разрядным, 32-разрядным, 64-разрядным и т. Д. 1 (должно быть не менее 16)

Указатель часто шире int, но может быть таким же или (редко) меньше. Соотношение может быть 2/1 или 1/1 или др.


1 Возможны и другие размеры, такие как 36-битный int или 48-битный указатель объекта. Это способность C адаптироваться практически к любому когда-либо построенному процессору и, вероятно, ко всем новым. Гибкость достигается за счет того, что код portable должен учитывать эти различия.

...