首页 >后端开发 >C++ >如何在编译时有效确定 C 数组的大小?

如何在编译时有效确定 C 数组的大小?

Barbara Streisand
Barbara Streisand原创
2024-11-30 08:06:16401浏览

How Can I Efficiently Determine the Size of a C   Array at Compile Time?

理解“数组的大小”模板函数

此代码定义了一个模板函数 GetArrLength,旨在确定数组的大小:

template<typename T, int size>
int GetArrLength(T(&amp;)[size]){return size;}

分解函数的参数

参数T(&)[size] 被声明为对 T 类型大小为 size 的数组的引用。这意味着它接受对类型和大小指定为模板参数的任何数组的引用。

模板参数匹配

调用此函数时,编译器会尝试推导模板参数。例如,如果我们这样调用:

int a[10];
GetArrLength(a);

编译器将确定 T 为 int,大小为 10,创建一个对 1​​0 个整数数组的参数引用。

函数行为

函数返回模板参数size的值,有效提供了模板中元素的数量array.

使用和限制

此代码简化了数组大小的获取,但有一些缺点。首先,它对模板参数和返回值都使用有符号类型,这是有问题的,因为大小不能为负数。为了获得更稳健的解决方案,应使用无符号类型,例如 std::size_t。

其次,此函数的结果不是常量表达式,即使数组大小应该是。常量表达式求值对于某些优化至关重要。

常量表达式解决方案

提供常量表达式结果的更高级方法涉及使用类型自省和 sizeof 运算符:

template <std::size_t N>
struct type_of_size
{
    typedef char type[N];
};

template <typename T, std::size_t Size>
typename type_of_size<Size>::type&amp; sizeof_array_helper(T(&amp;)[Size]);

#define sizeof_array(pArray) sizeof(sizeof_array_helper(pArray))

该技术利用了字符数组的大小等于其元素计数的事实。 sizeof 运算符检索用于表示模板参数大小的 char 数组的大小,提供数组大小的常量表达式评估。

以上是如何在编译时有效确定 C 数组的大小?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn