我如何在C中请求“至less”一个int的大小?
情况:
我有一个用C语言编写的应用程序,这个应用程序是资源密集型的,并且devise为可移植 我想让编译器为体系结构select最快的int大小,只要它至less是32位。
是否可以select“至less”32位的大小,还是编译器会自动优化这些types的东西?
标准头文件stdint.h
提供了typesint_leastN_t
和uint_leastN_t
,其中N
是uint_leastN_t
和64(可能还有其他的,但这些不是必需的)。 这些是C99的标准。
它还提供了“快速”替代方法,又名int_fastN_t
和uint_fastN_t
,具有相同的N
值。
所以,在你的情况下,你可以使用int_least32_t
或int_fast32_t
。
正如其他人所指出的那样,标准包含文件定义了int_fast32_t
, int_least32_t
, uint_fast32_t
, uint_least32_t
,这些文件应该可以按照您的要求运行,但是这些types需要谨慎使用。 由于整数提升规则,C代码无法避免使用int
和unsigned int
types。 此外,整数文字可能并不总是一个预期的types。 例如, int_fast32_T
和字面量0xABCD1234
或12345u
之间的比较可以作为有符号或无符号执行,具体取决于int
是16,32还是64位。 同样,如果n
是32位或更大,则n &= ~0x8000;
的含义n &= ~0x8000;
在一台16位的机器上会有所不同。
C标准从来没有特别devise,以便编写关心整数大小的代码,但是仍然可以在不同大小的硬件上兼容。 像int_fast32_t
这样的types可以很容易地编写代码,看起来应该是可移植的,但是可能会鼓励对隐藏在语言中的所有令人讨厌的小陷阱感到自满。
这个问题也被标记为C ++,所以这里是像我这样的模板元编程爱好者的解决scheme。
要求
- 一个types
list
types,在这里命名list
。 - 类似于Haskell的
filter
元函数。 -
head
元函数获取types列表的第一个元素。
代码
此解决scheme自动化接受的解决scheme(这只是“去stdint.h
并select最apropiate你” )。 那个工作可以由编译器来完成,不是吗?
首先列出在<cstdint>
处声明的所有特定于平台的最快整数types:
using integer_types = list<std::int_fast8_t,std::int_fast16_t, std::int_fast32_t,std::int_fast64_t>;
请注意,列表按增加的整数大小sorting。
现在定义一个过滤谓词。 在我们的情况下,尺寸应该小于用户指定的尺寸(将其命名为SIZE
):
template<typename T> using f = std::integral_constant<bool,sizeof(T)*CHAR_BITS <= SIZE>;
然后过滤整数types的列表并获得结果的第一个元素:
using best_integer_t = head<filter<f,integer_types>>;
总结解决scheme
template<std::size_t SIZE> struct fastest_integer_impl { //Guard for the case the user specified less than one byte size: static constexpr const std::size_t size = SIZE >= CHAR_BITS ? size : CHAR_BITS; using integer_types = list<std::int_fast8_t,std::int_fast16_t, std::int_fast32_t,std::int_fast64_t>; template<typename T> using f = std::integral_constant<bool,sizeof(T)*CHAR_BITS <= size>; using type = head<filter<f,integer_types>>; }; template<std::size_t SIZE> using fastest_integer = typename fastest_integer_impl<SIZE>::type;
最快=>使用编译指南包alignment到架构。 否则,如果内存不alignment,则需要多个内存访问。
分钟32 =>使用int说明符 – 足够。 据我所知,这确保了所有架构中的32位Linux操作系统。