Действительно ли size_t является портативным?

В версии 1.6.1.9 мерзавца для окон я нашел, что "ignorecase=true' в конфигурации был уже установлен по умолчанию.

5
задан Nayuki 8 September 2017 в 02:11
поделиться

8 ответов

size_t гарантированно может содержать количество байтов любого объекта в вашей реализации. Вот почему тип возврата sizeof - size_t .

Так что да, это переносимо.

7
ответ дан 18 December 2019 в 13:15
поделиться

Как говорили другие, size_t является правильным и вполне приемлемым для хранения результата sizeof () или размера любого представимого объекта в байтах . Вы должны обратить внимание на следующее:

  1. size_t имеет тот же размер, что и некоторый целочисленный тип без знака . Это не обязательно то же количество байтов, что и самый большой целочисленный тип без знака, unsigned int , unsigned long и т. Д.
  2. sizeof (size_t) является реализацией - определенное количество байтов, поэтому использование memcpy или присвоение ему любого целочисленного типа, кроме uintmax_t - плохая идея. Я даже не уверен, что можно с уверенностью предположить, что он имеет такой же размер или меньше, чем uintmax_t .
  3. Запись значения size_t в двоичный файл и чтение его обратно в size_t другим процессом, на другой машине или чем-то, скомпилированным с другими параметрами компилятора, может быть опасным для вашего здоровья.
  4. Отправка значения size_t по сети и попытка получить его с помощью буфера sizeof (size_t) на другой стороне довольно небезопасно.

Все из них - стандартные проблемы с любым другим целочисленным типом, кроме unsigned char . Таким образом, size_t переносится так же, как и любой другой целочисленный тип.

  • Отправка значения size_t по сети и попытка получить его с помощью буфера sizeof (size_t) на другой стороне довольно небезопасно.
  • Все это стандартно. проблемы с любым другим целочисленным типом, кроме unsigned char . Таким образом, size_t переносится так же, как и любой другой целочисленный тип.

  • Отправка значения size_t по сети и попытка получить его с помощью буфера sizeof (size_t) на другой стороне довольно небезопасно.
  • Все это стандартно. проблемы с любым другим целочисленным типом, кроме unsigned char . Таким образом, size_t переносится так же, как и любой другой целочисленный тип.

    6
    ответ дан 18 December 2019 в 13:15
    поделиться

    Имеет смысл использовать size_t или ssize_t для буфера, если вы используете malloc () или read (). Для переносимости используйте SIZE_MAX, SSIZE_MAX, sizeof (type-in-your-buffer) и% zd или% zu printf ().

    1
    ответ дан 18 December 2019 в 13:15
    поделиться

    У вас также есть off_t и ptrdiff_t / ssize_t, которые различаются между архитектурами одинаково.

    Если вы используете их правильно, они переносимы между архитектурами. В 32-битной системе все они будут иметь ширину 32 бита, а в 64-битной системе все они будут иметь ширину 64 бита. Это то, что вам нужно - размер буфера не может быть больше 32-битного size_t в 32-битной системе, но он может быть намного больше в 64-битной системе.

    Вы никогда не должны используйте целые числа, длинные числа или что-нибудь еще. Помимо всего прочего, размер long зависит от платформы (32-разрядный в большинстве 32-разрядных систем, 64-разрядный в 64-разрядных системах Unix, 32-разрядный в 64-разрядной Windows).

    1
    ответ дан 18 December 2019 в 13:15
    поделиться

    Трудно понять, что вы подразумеваете под словом «переносной» в данном случае. Термин «переносимый» допускает множество существенно разных интерпретаций.

    Тип size_t имеет очень конкретное назначение. Он может содержать размер любого объекта в данной реализации. Т.е. это тип, который всегда может получить результат оператора sizeof () . Тип size_t не имеет другой цели, и в рамках своего предполагаемого приложения он на 100% переносим, ​​настолько переносим, ​​насколько может быть все.

    О каком «переносном» вы спрашиваете, опять же, нет. ясно.

    1
    ответ дан 18 December 2019 в 13:15
    поделиться

    Одна из причин, по которой, кажется, никто не упоминает об использовании тернарного оператора, по крайней мере, в таких языках, как D, которые поддерживают вывод типов, заключается в том, чтобы позволить выводам типов работать для удивительно сложных типов шаблонов. --- 634022-

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

    0
    ответ дан 18 December 2019 в 13:15
    поделиться

    Зависит от того, для чего вы используете size_t.

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

    С другой стороны, если вы используете его как общее беззнаковое целое число, например, для подсчета количества звезд во Вселенной, у вас может возникнуть проблема в 32-битной системе (не уверен в 64-битных системах).

    0
    ответ дан 18 December 2019 в 13:15
    поделиться

    Единственная серьезная проблема с этим - это попытка получить доступ к довольно большому массиву или большому числу для size_t.

    Точно так же, как обычного "int" может быть достаточно на 64- бит, но может вызвать сбой в 32-битной системе, потому что он слишком велик для int в 32-битной системе.

    -2
    ответ дан 18 December 2019 в 13:15
    поделиться
    Другие вопросы по тегам:

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