使用 g++ -O2 此函数计算为内联常量:
#include <climits>
#include <stddef.h>
#include <stdint.h>
#include <cstdio>
template <typename T>
size_t num_bits()
{
return sizeof (T) * (CHAR_BIT);
}
int main()
{
printf("uint8_t : %d\n", num_bits<uint8_t>());
printf("size_t : %d\n", num_bits<size_t>());
printf("long long : %d\n", num_bits<long long>());
printf("void* : %d\n", num_bits<void*>());
printf("bool : %d\n", num_bits<bool>());
printf("float : %d\n", num_bits<float>());
printf("double : %d\n", num_bits<double>());
printf("long double : %d\n", num_bits<long double>());
return 0;
}
输出:
uint8_t : 8
size_t : 32
long long : 64
void* : 32
bool : 8
float : 32
double : 64
long double : 96
生成的 X86 32 位汇编:
---剪辑---
movl $32, 8(%esp) <--- const $32
movl $.LC1, 4(%esp)
movl $1, (%esp)
call __printf_chk
movl $64, 8(%esp) <--- const $64
movl $.LC2, 4(%esp)
movl $1, (%esp)
call __printf_chk
---剪辑---