15 Nisan 2019 Pazartesi

std::size_t tipi - unsigned

Giriş
size_t hem C hem de C++ standartlarında var. C++'ta std::size_t olarak tanımlı.

C için şu satırı dahil ederiz.
#include <stdint.h>  /* SIZE_MAX */
C++ için şu satırı dahil ederiz.
#include <cstddef>
C++ hem global hem de std isim alanları içinde tanımlama yapar. Açıklaması şöyle.
C-style header names like <stddef.h> are deprecated. However, C++-style headers like <cstddef> are allowed to declare their names in global namespace and then redeclare the same names in namespace std through using-declarations
std::size_t unsigned bir tiptir
size_t unsigned bir değer döner. Örneğin bir çok veri yapısının count() metodu size_t döner. unsigned değer 0 ise, 0'dan 1 çıkartmak -1 yerine başka bir sonuç verir. Bu durum bir sürü hataya sebep oluyor. Signed/Unsigned Integer Karışımı yazısına bakabilirsini.z

SIZE_MAX
size_t'nin alabileceği en büyük değeri temsil ederi. Bu değerin ne olacağı belirsiz. Ancak en az ne olması gerektiği belli. Açıklaması şöyle.
size_t is specified to be a standard unsigned integer, but the standard does not restrict its size relative to any of them other than by saying that it must be able to hold at least 65535.
Bu değer ile calloc arasında da bağlantı var.
( size_t - 1) değeri SIZE_MAX ile temsil edilir. Bu değer gcc'de şöyle tanımlı. 64 bit için bayağı büyük bir rakam verilmiş.
/* Limit of `size_t' type.  */
# if __WORDSIZE == 64
#  define SIZE_MAX              (18446744073709551615UL)
# else
#  define SIZE_MAX              (4294967295U)
# endif
size_t ve int ilişkisi
size_t int'ten daha büyük veya daha küçük olacak diye hiçbir ilişki tanımlı değil. Açıklaması şöyle.
The current C standard does not require size_t to be at least as wide as an int, and I'm skeptical about any version of the standard ever doing so. size_t needs to be able to represent any number which might be the size of an object; if the implementation limits object sizes to be 24 bits wide, then size_t could be a 24-bit unsigned type, regardless of what an int is.
int yerine size_t
int yerine size_t kullanmak zorunda değiliz. Açıklaması şöyle.
size_t is an unsigned integer that is capable of holding the size of the largest object you can allocate. It is useful for indexing because this means it can index into the largest array you can allocate.

This does not mean it is required or even necessarily recommended for indexing. You can use any integer type that is large enough to index the array. int_fast32_t might be faster, uint_least16_t might be smaller in a structure, and so on. Know your data, and you can make a good choice.

Ancak bence int yerine size_t kullanmak daha iyi. Eskiden şöyle yapardık.
double get(const double* p, int k) {
  return p[k];
}
Şimdi şöyle yaparız.
double get(const double* p, size_t k) {
  return p[k];
}

Hiç yorum yok:

Yorum Gönder