Что такое sizeof (size_t) на 32-разрядном по сравнению с различными 64-разрядными моделями данных?

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    let cs = NSCharacterSet.decimalDigits.inverted
    let filtered = string.components(separatedBy: cs).joined(separator: "")
    return (string == filtered)
}
45
задан Kahler 24 April 2014 в 21:57
поделиться

4 ответа

size_t определяется стандартом C как беззнаковый целочисленный тип возвращаемого значения оператора sizeof (C99 6.3.5.4.4), а также аргумент malloc и друзей (C99 7.20.3.3 и т. Д. ). Фактический диапазон установлен так, чтобы максимум (SIZE_MAX) был не менее 65535 (C99 7.18.3.2).

Однако это не позволяет нам определить sizeof (size_t). Реализация может использовать любое представление, которое ей нравится для size_t - поэтому нет верхней границы размера - и реализация также может определять байт как 16-битный, и в этом случае size_t может быть эквивалентным беззнаковому char.

Однако в целом у вас будет 32-битный size_t в 32-битных программах и 64-битный в 64-битных программах, независимо от модели данных. Обычно модель данных влияет только на статические данные; например, в GCC:

`-mcmodel=small'
     Generate code for the small code model: the program and its
     symbols must be linked in the lower 2 GB of the address space.
     Pointers are 64 bits.  Programs can be statically or dynamically
     linked.  This is the default code model.

`-mcmodel=kernel'
     Generate code for the kernel code model.  The kernel runs in the
     negative 2 GB of the address space.  This model has to be used for
     Linux kernel code.

`-mcmodel=medium'
     Generate code for the medium model: The program is linked in the
     lower 2 GB of the address space but symbols can be located
     anywhere in the address space.  Programs can be statically or
     dynamically linked, but building of shared libraries are not
     supported with the medium model.

`-mcmodel=large'
     Generate code for the large model: This model makes no assumptions
     about addresses and sizes of sections.

You ' Замечу, что указатели во всех случаях 64-битные; В конце концов, нет смысла иметь 64-битные указатели, но не 64-битные размеры.

54
ответ дан 26 November 2019 в 21:20
поделиться

он должен варьироваться в зависимости от архитектуры, поскольку представляет размер любого объекта. Таким образом, в 32-битной системе size_t , вероятно, будет иметь ширину не менее 32 бит. В 64-битной системе он, вероятно, будет как минимум 64-битной шириной.

10
ответ дан 26 November 2019 в 21:20
поделиться

size_t обычно 64-битный на 64-битной машине

5
ответ дан 26 November 2019 в 21:20
поделиться

РЕДАКТИРОВАТЬ: Спасибо за комментарии - я нашел его в стандарте C99 , который говорит в разделе 6.5.3.4: [

] Значение результата равно определяется реализацией, и его тип ( целочисленный тип без знака ) равен size_t , определено в (и других заголовки)

Итак, размер size_t не указан, только то, что он должен быть целым числом без знака. Однако в главе 7.18.3 стандарта можно найти интересную спецификацию:

предел size_t

SIZE_MAX 65535

Что в основном означает, что независимо от размера size_t , допустимый диапазон значений от 0 до 65535, остальное зависит от реализации.

4
ответ дан 26 November 2019 в 21:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: