【问题标题】:What is the better way of getting a length of a C-Style Array? [duplicate]获取 C 样式数组长度的更好方法是什么? [复制]
【发布时间】:2020-02-10 18:12:54
【问题描述】:

这些天我正在阅读 C++ 入门。书上说,要获取 C 样式数组的长度,可以使用函数 std::begin 和 std::end 获取两个指针并将它们相减。但是,我知道如果 a 是 C 样式数组,我也可以使用 sizeof(a)/sizeof(a[0])。那么哪种方式更好,或者它们只是差别不大?

【问题讨论】:

  • 这个已经在this SO question详细讨论过
  • 获得尺寸的最佳方法是一开始就不要扔掉它。 const count = 5; int array[count];.

标签: c++ c++11


【解决方案1】:

当今最好的方式(C++17 及以上)是std::size:

#include <iterator>
...
int arr[5];
static_assert(std::size(arr) == 5);

如果您无法访问 C++17,也很容易自己动手:

template <class T, size_t N>
constexpr size_t size(const T (&arr)[N]) { return N; }

更好的是,只需使用std::array,并使用它的大小成员:

std::array<int, 5> arr;
static_assert(arr.size() == 5);

【讨论】:

  • ...和std::array 是最好的。 ;)
  • @UlrichEckhardt,绝对是
【解决方案2】:

std::beginstd::end 的方法更好,因为它更安全。 std::size也是如此。

如果你错误地在指针而不是数组上使用了sizeof(a)/sizeof(a[0]) 方法,编译器很可能什么都不告诉你,你会得到一个毫无意义的结果。其他方法会导致编译错误,你就会知道你正在尝试做错事。

std::beginstd::end 方法的一个缺点是结果不是常量表达式。 std::size 的结果是,所以这应该是获取 C 样式数组大小的首选方法。

【讨论】:

  • std::beginstd::end 之间的差异可以在编译时计算吗?否则,计算大小可能会产生运行时开销。
  • @TrickorTreat 虽然不能保证,但可以。 godbolt.org/z/ZPzjfG
猜你喜欢
  • 1970-01-01
  • 2020-08-28
  • 1970-01-01
  • 2011-09-16
  • 2013-06-09
  • 2010-12-14
  • 1970-01-01
  • 1970-01-01
  • 2016-06-24
相关资源
最近更新 更多