情况:
我有一个用C编写的应用程序,这是一个资源密集型,并且设计为可移植的。我想允许编译器为架构选择最快的int大小,前提是它至少为32位。
是否可以选择"至少"的大小。 32位,还是编译器会自动优化这些东西?
答案 0 :(得分:92)
标准标题stdint.h
提供int_leastN_t
和uint_leastN_t
类型,其中N
为8,16,32和64(可能还有其他,但这些不是需要)。这些是C99的标准。
它还提供"快速"替代方案,即int_fastN_t
和uint_fastN_t
,具有相同的N
值。
因此,在您的情况下,您可以使用int_least32_t
或int_fast32_t
。
答案 1 :(得分:20)
正如其他人所指出的那样,标准包含文件定义int_fast32_t
,int_least32_t
,uint_fast32_t
,uint_least32_t
应该可以按照您的意愿行事,但这些类型需要是经常使用。由于整数提升规则,C代码无法避免使用类型int
和unsigned int
。此外,整数文字可能并不总是所期望的类型。例如,int_fast32_T
与文字0xABCD1234
或12345u
之间的比较可以作为有符号或无符号执行,具体取决于int
是否为16,32或64位。同样,如果n
为32位或更大,则n &= ~0x8000;
的含义在16位机器上与较大的机器上的含义不同。
C标准从未特别设计用于编写关注整数大小的代码,但仍然可以在具有不同大小的硬件上兼容。像int_fast32_t
这样的类型可以很容易地编写看起来应该是可移植的代码,但可能会鼓励对隐藏在语言中的所有讨厌的小陷阱感到自满。
答案 2 :(得分:10)
这个问题也被标记为C ++,所以这里是像我这样的模板元编程爱好者的解决方案。
list
。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位。