我怎么在C中要求“至少”一个int的大小

时间:2014-07-21 13:28:14

标签: c++ c optimization

情况:

我有一个用C编写的应用程序,这是一个资源密集型,并且设计为可移植的。我想允许编译器为架构选择最快的int大小,前提是它至少为32位。

是否可以选择"至少"的大小。 32位,还是编译器会自动优化这些东西?

4 个答案:

答案 0 :(得分:92)

标准标题stdint.h提供int_leastN_tuint_leastN_t类型,其中N为8,16,32和64(可能还有其他,但这些不是需要)。这些是C99的标准。

它还提供"快速"替代方案,即int_fastN_tuint_fastN_t,具有相同的N值。

因此,在您的情况下,您可以使用int_least32_tint_fast32_t

答案 1 :(得分:20)

正如其他人所指出的那样,标准包含文件定义int_fast32_tint_least32_tuint_fast32_tuint_least32_t应该可以按照您的意愿行事,但这些类型需要是经常使用。由于整数提升规则,C代码无法避免使用类型intunsigned int。此外,整数文字可能并不总是所期望的类型。例如,int_fast32_T与文字0xABCD123412345u之间的比较可以作为有符号或无符号执行,具体取决于int是否为16,32或64位。同样,如果n为32位或更大,则n &= ~0x8000;的含义在16位机器上与较大的机器上的含义不同。

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

答案 2 :(得分:10)

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

要求

  • 一种类型列表类型,此处名为list
  • 类似Haskell的filter元函数。
  • 获取类型列表的第一个元素的head元函数。

代码

此解决方案可自动执行已接受的解决方案(只需"转到stdint.h并为您选择最适合的解决方案" )。这项工作可以由编译器来完成,不是吗?

首先列出在<cstdint>声明的所有平台特定的最快整数类型:

using integer_types = list<std::int_fast8_t,std::int_fast16_t,
                           std::int_fast32_t,std::int_fast64_t>;

请注意,列表按增加的整数大小排序 现在定义过滤谓词。在我们的例子中,大小应该小于用户指定的大小(将其命名为SIZE):

template<typename T>
using f = std::integral_constant<bool,sizeof(T)*CHAR_BITS <= SIZE>;

然后过滤整数类型列表并获取结果的第一个元素:

using best_integer_t = head<filter<f,integer_types>>;

汇总解决方案

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;

答案 3 :(得分:-5)

最快=&gt;使用pragma pack与架构对齐。如果没有这个,如果内存未对齐,则需要多个内存访问。

min 32 =&gt;使用int说明符 - 足够了。据我所知,这确保了所有体系结构中linux的32位。