我如何在C中请求“至less”一个int的大小?

情况:

我有一个用C语言编写的应用程序,这个应用程序是资源密集型的,并且devise为可移植 我想让编译器为体系结构select最快的int大小,只要它至less是32位。

是否可以select“至less”32位的大小,还是编译器会自动优化这些types的东西?

标准头文件stdint.h提供了typesint_leastN_tuint_leastN_t ,其中Nuint_leastN_t和64(可能还有其他的,但这些不是必需的)。 这些是C99的标准。

它还提供了“快速”替代方法,又名int_fastN_tuint_fastN_t ,具有相同的N值。

所以,在你的情况下,你可以使用int_least32_tint_fast32_t

正如其他人所指出的那样,标准包含文件定义了int_fast32_tint_least32_tuint_fast32_tuint_least32_t ,这些文件应该可以按照您的要求运行,但是这些types需要谨慎使用。 由于整数提升规则,C代码无法避免使用intunsigned inttypes。 此外,整数文字可能并不总是一个预期的types。 例如, int_fast32_T和字面量0xABCD123412345u之间的比较可以作为有符号或无符号执行,具体取决于int是16,32还是64位。 同样,如果n是32位或更大,则n &= ~0x8000;的含义n &= ~0x8000; 在一台16位的机器上会有所不同。

C标准从来没有特别devise,以便编写关心整数大小的代码,但是仍然可以在不同大小的硬件上兼容。 像int_fast32_t这样的types可以很容易地编写代码,看起来应该是可移植的,但是可能会鼓励对隐藏在语言中的所有令人讨厌的小陷阱感到自满。

这个问题也被标记为C ++,所以这里是像我这样的模板元编程爱好者的解决scheme。

要求

  • 一个typeslisttypes,在这里命名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操作系统。