Какая потребность в size_t? [Дубликат]

2017 ответ: теперь вы можете делать то, что хотите, в каждом текущем браузере и узле

. Это довольно просто:

  • Вернуть обещание
  • Используйте 'await' , в котором JavaScript ожидает, что обещание будет разрешено в vlue (например, hTTP-ответ)
  • Добавьте 'async' для родительской функции

Вот рабочая версия вашего кода:

(async function(){

var response = await superagent.get('...')
console.log(response)

})()

ожидание поддерживается во всех текущих браузерах и узлах 8 [/ д2]

475
задан Peter Mortensen 11 December 2013 в 13:35
поделиться

10 ответов

Если вы являетесь эмпирическим типом

echo | gcc -E -xc -include 'stddef.h' - | grep size_t

Вывод для Ubuntu 14.04 64-разрядный GCC 4.8:

typedef long unsigned int size_t;

Обратите внимание, что stddef.h предоставляется GCC, а не glibc под src/gcc/ginclude/stddef.h в GCC 4.2.

Интересные появления C99

  • malloc принимают size_t как аргумент, поэтому он определяет максимальный размер, который может быть выделен. И поскольку он также возвращается sizeof, я думаю, что он ограничивает максимальный размер любого массива. См. Также: Максимальный размер массива в C
366
ответ дан Community 26 August 2018 в 19:26
поделиться

size_t - это тип, который может содержать любой индекс массива.

В зависимости от реализации он может быть любым из:

unsigned char

unsigned short

unsigned int

unsigned long

unsigned long long

Вот как size_t определяется в stddef.h моей машины:

typedef unsigned long size_t;
58
ответ дан Arjun Sreedharan 26 August 2018 в 19:26
поделиться

size_t или любой неподписанный тип можно рассматривать как переменную цикла, поскольку переменные цикла обычно больше или равны 0.

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

// C program to demonstrate that size_t or
// any unsigned int type should be used 
// carefully when used in a loop

#include<stdio.h>
int main()
{
const size_t N = 10;
int a[N];

// This is fine
for (size_t n = 0; n < N; ++n)
a[n] = n;

// But reverse cycles are tricky for unsigned 
// types as can lead to infinite loop
for (size_t n = N-1; n >= 0; --n)
printf("%d ", a[n]);
}

Output
Infinite loop and then segmentation fault
0
ответ дан bishwas pokharel 26 August 2018 в 19:26
поделиться

В manpage для types.h указано:

size_t должен быть целым числом без знака

16
ответ дан codaddict 26 August 2018 в 19:26
поделиться

size_t и int не являются взаимозаменяемыми. Например, в 64-разрядной версии Linux size_t имеется 64-разрядный размер (т. Е. sizeof(void*)), но int - 32-разрядный.

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

Как правило, я бы предложил использовать int для большинства общих случаев и использовать только size_t / ssize_t, когда есть определенная потребность в нем (например, с mmap()).

5
ответ дан dtoux 26 August 2018 в 19:26
поделиться

size_t является неподписанным типом. Таким образом, он не может представлять никаких отрицательных значений (& lt; 0). Вы используете его, когда считаете что-то, и уверены, что он не может быть отрицательным. Например, strlen() возвращает size_t, поскольку длина строки должна быть не менее 0.

В вашем примере, если ваш индекс цикла будет всегда больше 0, может иметь смысл использовать size_t или любой другой неподписанный тип данных.

Когда вы используете объект size_t, вы должны убедиться, что во всех контекстах это используется, включая арифметику, вы хотите неотрицательные значения. Например, предположим, что у вас есть:

size_t s1 = strlen(str1);
size_t s2 = strlen(str2);

, и вы хотите найти разницу в длинах str2 и str1. Вы не можете делать:

int diff = s2 - s1; /* bad */

Это связано с тем, что значение, назначенное diff, всегда будет положительным числом, даже когда s2 < s1, потому что вычисление выполняется с неподписанными типами. В этом случае, в зависимости от вашего варианта использования, вам может быть лучше использовать int (или long long) для s1 и s2.

В C / POSIX, который мог / должен использовать size_t, но не из-за исторических причин. Например, второй параметр fgets в идеале должен быть size_t, но есть int.

179
ответ дан Gaurang Tandon 26 August 2018 в 19:26
поделиться

По моему мнению, size_t - это целое число unsigned, размер бита которого достаточно велик, чтобы удерживать указатель на собственную архитектуру.

Итак:

sizeof(size_t) >= sizeof(void*)
-5
ответ дан newfurniturey 26 August 2018 в 19:26
поделиться

В общем, если вы начинаете с 0 и поднимаетесь вверх, всегда используйте неподписанный тип, чтобы избежать переполнения, в результате чего вы попадаете в ситуацию с отрицательным значением. Это критически важно, потому что, если границы вашего массива будут меньше максимального значения вашего цикла, но ваш макс max больше максимального значения вашего типа, вы обернете негатив, и вы можете столкнуться с сегментацией fault (SIGSEGV). Поэтому, вообще говоря, никогда не используйте int для цикла, начинающегося с 0 и идущего вверх. Используйте unsigned.

3
ответ дан Peter Mortensen 26 August 2018 в 19:26
поделиться

size_t - целочисленный тип данных без знака. В системах, использующих библиотеку GNU C, это будет unsigned int или unsigned long int. size_t обычно используется для индексирования массива и подсчета циклов.

0
ответ дан Prince 26 August 2018 в 19:26
поделиться

Поскольку никто еще не упомянул об этом, основным лингвистическим значением size_t является то, что оператор sizeof возвращает значение этого типа. Аналогичным образом, основное значение ptrdiff_t заключается в том, что вычитание одного указателя из другого даст значение этого типа. Функции библиотеки, которые его принимают, делают это, потому что это позволит таким функциям работать с объектами, размер которых превышает UINT_MAX в системах, где такие объекты могут существовать, не заставляя вызывающих абонентов тратить код, передавая значение, большее, чем «unsigned int» в системах, где больший тип было бы достаточно для всех возможных объектов.

11
ответ дан supercat 26 August 2018 в 19:26
поделиться
Другие вопросы по тегам:

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