size_t que c++ standards

c++ - que - size_t arduino



es size_t siempre sin firmar? (6)

Como título: es size_t siempre sin signo, es decir, para size_t x , es x siempre >= 0 ?


De acuerdo con el estándar no está firmado, sin embargo, recuerdo que algunas implementaciones anteriores usaban un tipo firmado para typedef.

De un antiguo documento de GCC:

Existe un problema potencial con el tipo size_t y las versiones de GCC antes de la versión 2.4. ANSI C requiere que size_t siempre sea un tipo sin signo. Para la compatibilidad con los archivos de encabezado de los sistemas existentes, GCC define size_t en stddef.h como el tipo que sys/types.h define. La mayoría de los sistemas Unix que definen size_t en sys/types.h , lo definen como un tipo firmado. Algunos códigos en la biblioteca dependen de que size_t sea ​​un tipo sin firma, y ​​no funcionará correctamente si está firmado

No estoy seguro de lo importante que sería protegerse contra eso. Mi código asume que está sin firmar.


El tamaño_t debe seguir la misma definición que el estándar C, y en varios lugares del estándar C ++ implica que está sin signo natura (particularmente en las definiciones de argumento de la plantilla del asignador).

En la Norma C ++, sección 18.1 (ISO / IEC 14882 - Primera edición 1998-01-01):

La tabla 15 enumera como tipos definidos: ptrdiff_t y size_t

3 El contenido es el mismo que el encabezado de la biblioteca de Standard C, con los siguientes cambios: 4 La macro NULL es una constante de puntero nulo de C ++ definida por la implementación en esta Norma Internacional (4.10).

La macro offsetof acepta un conjunto restringido de argumentos de tipo en esta Norma Internacional. el tipo será una estructura POD o una unión POD (cláusula 9). El resultado de aplicar la macro offsetof a un campo que es un miembro de datos estáticos o un miembro de función no está definido. VEA TAMBIÉN: la subcláusula 5.3.3, Sizeof, la subcláusula 5.7, los operadores aditivos, la subcláusula 12.5, la tienda gratuita y la subcláusula ISO C 7.1.6.


Oh, esto es simplemente terrible:

vector<MyObject> arr; Fill(arr); size_t size = arr.size(); for(size_t i = 1; i < size - 1; ++i) { auto obj = arr[i]; auto next = arr[i+1]; }

Ahora contemplar el caso de uso donde arr está vacío.


Sí, se garantiza que size_t es un tipo sin firma.


Según la norma ISO C de 1999 (C99), size_t es un tipo entero sin signo de al menos 16 bits (consulte las secciones 7.17 y 7.18.3).

La norma también recomienda que size_t no debería tener un rango de conversión entero mayor que long si es posible, es decir, convertir size_t a unsigned long no es problemático si se sigue la recomendación.

El estándar ANSI C de 1989 (ANSI C) no menciona un tamaño mínimo ni un rango de conversión recomendado.

El estándar ISO C ++ de 1998 (C ++ 98) (así como el borrador actual para C ++ 0x) se refiere al estándar C. La sección 18.1 dice:

El contenido es el mismo que el encabezado de la biblioteca C estándar <stddef.h> [...]

Según la sección 1.2, esto significa la biblioteca tal como se define en la norma ISO C de 1990 (C90), incluida su primera enmienda de 1995 (C95):

La biblioteca descrita en la cláusula 7 de ISO / IEC 9899: 1990 y la cláusula 7 de ISO / IEC 9899 / Amd.1: 1995 se denomina en lo sucesivo la biblioteca C estándar .

Las partes relacionadas con size_t deben heredarse de ANSI C: Aparte de la numeración de la parte frontal y de la sección, los estándares para C90 y ANSI C son idénticos. Necesitaría una copia de la enmienda normativa para estar seguro de que no hubo cambios relevantes en stddef.h , pero lo dudo. El tamaño mínimo parece introducirse con stdint.h , es decir, C99.

Por favor, considere también la siguiente cita de la sección 1.2 de C ++ 98:

Todas las normas están sujetas a revisión, y se recomienda a las partes de los acuerdos basados ​​en esta Norma Internacional que investiguen la posibilidad de aplicar las ediciones más recientes de las normas que se indican a continuación.


Si Generalmente se define como algo como lo siguiente (en sistemas de 32 bits):

typedef unsigned int size_t;

Referencia:

El estándar C ++ La Sección 18.1 define que size_t está en <cstddef> que se describe en C Standard como <stddef.h> .
La sección 4.1.5 del estándar C define size_t como un tipo integral sin signo del resultado del operador sizeof