sizeof(T) * CHAR_BIT гарантира ли размер на битовете?

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

Прав ли съм да приема, че това може да стане по следния начин?

#include <climits>

template <typename T>
size_t Size_In_Bits(){
    return sizeof(T) * CHAR_BIT;
}

Това винаги ли ще върне количеството битове, които могат да бъдат насочени към даден тип?


person Trevor Hickey    schedule 08.03.2016    source източник
comment
Какво е малко, което може да бъде насочено към тип?   -  person user253751    schedule 09.03.2016
comment
@chux Промених C тага на C++. Въпреки това бих искал да знам дали има разлики между езиците. Горната реализация може вместо това да бъде C макрос с limits.h   -  person Trevor Hickey    schedule 09.03.2016
comment
Уверен, че няма разлика в размера между C/C++.   -  person chux - Reinstate Monica    schedule 09.03.2016
comment
@immibis Да, предполагам, че това е подвеждащо. Количеството битове, които са физически съхранени в паметта и могат да бъдат променени чрез битови манипулации.   -  person Trevor Hickey    schedule 09.03.2016


Отговори (2)


Това гарантирано ще ви даде размер (съхранение) в битове, но не и ширина (брой стойностни битове). Последното може да бъде по-малко, ако типът има битове за подпълване. За типовете без знак можете да измерите броя на битовете стойност директно, като преобразувате -1 в типа (за да получите максималната възможна стойност в типа) и ги преброите. За типове със знак std::numeric_limits<T>::max() може да се използва за получаване на макс. Или, ако вече знаете конкретния тип, можете да използвате макросите xxx_MAX от limits.h или stdint.h.

person R.. GitHub STOP HELPING ICE    schedule 08.03.2016
comment
Добър отговор за преобразуването (без знак) -1 към типа и преброяването им и няма начин за измерване на броя битове стойност в тип със знак. - person chux - Reinstate Monica; 09.03.2016
comment
ако знаете кой тип е - или можете да използвате std::numeric_limits<T>::max() - person user253751; 09.03.2016
comment
О, съжалявам, въпросът беше маркиран C++, а не C. В такъв случай отговорът ми е малко грешен... - person R.. GitHub STOP HELPING ICE; 09.03.2016
comment
Направени са някои промени; дано сега е по-добре. - person R.. GitHub STOP HELPING ICE; 09.03.2016
comment
@R.. Мислех, че underflow е недефинирано поведение? Или е различно, когато инициализирате и деподпишете с отрицателно 1? - person Trevor Hickey; 09.03.2016
comment
@TrevorHickey: Не се получава преливане. Целочислените преобразувания в типове без знак са добре дефинирани и се извършват като редукция по модул TYPE_MAX+1. - person R.. GitHub STOP HELPING ICE; 09.03.2016

sizeof(T) * CHAR_BIT връща броя на битовете, които типът заема в паметта.

Все пак размерът на битовете може да бъде повече от битовете, които цялото число може да се използва математически - (помислете за битове за допълване).


Подробности: целите числа имат битове за стойност, бит за знак (цели числа със знак) и възможни битове за допълване. Всички тези битове допринасят за размера на съхранението.

unsigned char никога няма да има битове за допълване.

person chux - Reinstate Monica    schedule 08.03.2016
comment
Наричането на това подплънка е изключително подвеждащо. Padding означава нещо друго в C и C++. - person Lightness Races in Orbit; 09.03.2016
comment
@BarryTheHatchet C Spec §6.2.6.2 2 извиква допълнителните битове за допълващи битове. Подпълването, използвано тук, не е изключително подвеждащо в C и C++, тъй като се използва в 2 контекста: битове, както е споменато тук, и подпълващи байтове на структури. Отговорът е преработен, за да ги нарече запълващи битове, за да помогне за разграничаване от запълващи байтове. IAC, това все още е форма на запълване според езиковата спецификация. - person chux - Reinstate Monica; 09.03.2016
comment
Може би спецификацията на C го прави, но спецификацията на C++ не (модул на едно, осиротяло споменаване в ненормативен текст под §29.6.5, свързан с поведението на memcpy). Допълнителните битове обаче все още са достатъчно разграничаващи, така че благодаря за добавянето на втората дума. - person Lightness Races in Orbit; 09.03.2016
comment
@BarryTheHatchet Обърнете внимание, че по време на този отговор публикацията беше маркирана с [C], а не с [C++]. OP беше двусмислен относно C/C++, но въпреки това използваше C++ template и по-късно промени етикета от C на C++. - person chux - Reinstate Monica; 09.03.2016