Почему strlen () возвращает 64-битное целое число? Я что-то пропустил? - PullRequest
2 голосов
/ 14 июля 2009

Почему при компиляции 64-битного приложения strlen () возвращает 64-битное целое число? Я что-то пропустил?

Я понимаю, что strlen () возвращает тип size_t, и по определению это не должно меняться, но ... Зачем strlen потребуется для возврата 64-разрядного целого числа?

Функция предназначена для использования со строками. С этим сказал:

Обычно программисты создают строки размером в несколько гигабайт или несколько терабайт? Если бы они это сделали, разве им не понадобился бы лучший способ определить длину строки, чем поиск символа NULL?

Я думаю, что это смешно, на самом деле, может быть, нам нужна функция StrLenAsync () с обратным вызовом, чтобы обработать сверхдлинный процесс поиска NULL в строке 40 ТБ. Звучит глупо? Да, хорошо strlen () возвращает 64-битное целое число!

Конечно, предложенная функция StrLenAsync () - шутка.

Ответы [ 7 ]

18 голосов
/ 14 июля 2009

Похоже, при компиляции для 64-битной цели size_t определяется как 64-битная. Это имеет смысл, поскольку size_t используется для размеров всех типов объектов, а не только строк.

8 голосов
/ 14 июля 2009

В 64-битном приложении определенно можно создать строку размером 5 ГБ.

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

Даже если бы в этом не было необходимости, не стоило бы менять спецификацию strlen вместо использования size_t, чтобы сделать возвращаемое значение 4 вместо 8 байтов.

7 голосов
/ 14 июля 2009

Вот диаграмма, которая показывает размер некоторых основных типов в наиболее распространенных моделях данных:

         ILP32 LP64 LLP64 ILP64
char       8     8     8     8
short     16    16    16    16
int       32    32    32    64
long      32    64    32    64
long long 64    64    64    64
pointer   32    64    64    64
size_t    32    64    64    64

32-разрядная модель данных Windows - ILP32, а 64-разрядная модель Windows - LLP64.

3 голосов
/ 14 июля 2009

Я могу вспомнить несколько приложений, в которых просто недостаточно строки в 4 ГБ (вычислительная биология, компьютерная криминалистика - две ОГРОМНЫЕ). Не думайте, что потому что ВЫ не делаете этого, как никто другой.

2 голосов
/ 14 июля 2009

Дело не в том, кто-нибудь на самом деле сделает строку такого размера. По соглашению, ВСЕ возвращаемые типы, которые указывают количество байтов, занимаемых в памяти, имеют размер_т

.
1 голос
/ 14 июля 2009

Ну, 1) size_t является typedef и зависит от архитектуры и 2) Не имеет ли смысла иметь наибольшее целое число в качестве возвращаемого значения? Почему 32 бита? Почему не 16? На вашем компьютере это 64, потому что это максимально возможная длина строки.

0 голосов
/ 14 июля 2009

strlen() должен использовать тип возврата, который может представлять размер самого большого объекта в модели размещения.

Вы можете использовать std::string. Его size_type равно распределителю size_type. Так что если вы создадите свой собственный распределитель, то std::string::size() может использовать даже char в качестве возвращаемого типа.

Спасибо за замечание в комментариях. std::string - это просто специализация std::basic_string. Конечно, вы должны использовать std::basic_string с пользовательским распределителем.

...