情况:
我有一个用C语言编写的应用程序,它需要占用大量资源,并且设计成可移植的。我希望允许编译器选择适合该架构最快的int大小,前提是它至少为32位。
是否可能选择至少32位的大小,或者编译器会自动为我优化这些内容?
情况:
我有一个用C语言编写的应用程序,它需要占用大量资源,并且设计成可移植的。我希望允许编译器选择适合该架构最快的int大小,前提是它至少为32位。
是否可能选择至少32位的大小,或者编译器会自动为我优化这些内容?
stdint.h
提供类型 int_leastN_t
和 uint_leastN_t
,其中 N
可以是 8、16、32 和 64(也可能有其他值,但不是必需的)。这些类型自 C99 标准开始就被定义了。N
值的 int_fastN_t
和 uint_fastN_t
。int_least32_t
或 int_fast32_t
。int_fast32_t
。int_least32_t
不是速度最快的 32 位整数类型,只是最小的类型。 - TonyKint_fast32_t
的定义是错误的,它实际上是一种更慢的类型(64 位而非32位):对于 +
/ -
/ *
,两者速度相同,但对于 /
来说它会慢得多,并且当然,由于使用了两倍的缓存行和两倍的内存带宽,加载/存储的速度也会变慢。因此,我非常不愿意使用它。我不知道有任何一种架构可以使用32位整型以外的最快数据类型处理“至少32位”的整数。 - R.. GitHub STOP HELPING ICEshort
也应该是一样的,对吧?也就是说,如果它们实际上更小,并且C没有自动将它们提升为int
,那么short
的除法应该更快,对吗? - user541686list
。filter
元函数。head
元函数,用于获取类型列表的第一个元素。这个解决方案自动化了已接受的解决方案(即“转到并选择最适合您的”)。编译器可以完成这项工作,不是吗?
首先列出在<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;
最快 => 使用#pragma pack对齐架构。如果不对齐内存,则可能需要多次内存访问。
最小32 => 使用int说明符 - 足够了。据我所知,这可以确保在Linux上跨所有架构使用32位。
pragma pack
会导致数据不对齐,因为它阻止了编译器插入必要的填充以保持数据对齐。 - Mysticial
int_least32_t
的stdint.h
类型定义。 - toasted_flakes