传递给函数的数组对象的大小

Size of array object passed to function

我是运行以下C++代码:

class Tile {
    //class definition
};

bool myFunction(Tile* Tiles) {
    sizeof(Tiles);
    sizeof(Tiles[0]);
    //other code
}

int main () {
    Tile tiles [16];
    //other stuff
    myFunction(tiles);
    return 0;
}

当我使用上面描述的 sizeof 方法时,它只给我指针的大小,而不是实际的对象。我正在尝试查找对象的大小。我的问题是如何获取给定指针的对象的大小?

数组自然会退化为指针,当它们退化时,所有大小信息都会丢失。最常见的解决方案是将数组中元素的数量作为参数传递。也可以使用模板来推断数组大小。

使用std::array (or std::vector,视情况而定),这是我推荐的解决方案。

最简单的 C 风格方法是将数组大小作为参数传递。

bool myFunction_ver1(Tile* Tiles, std::size_t size)
{
    //...
}

但 C++ 提供的更多。由于数组大小包含在数组的数据类型中,因此模板可以提供帮助。数组应该通过引用传递,以防止数组被调整为指针。

template <std::size_t N>
bool myFunction_ver2(const Tile (&Tiles)[N])
{
    // N is the array size
}

但我们应该更喜欢使用 std::arraystd::vector 而不是原始数组。

template <std::size_t N>
bool myFunction_ver3(const std::array<Tile, N>& Tiles)
{
    // You may use N or Tiles.size()
}

bool myFunction_ver4(const std::vector<Tile>& Tiles)
{
    // use Tiles.size()
}

原始数组衰减为指针作为函数参数,因此与类型相关的任何长度信息都会在不使用模板的情况下被删除。因此,使用原始数组,您可以将数组的大小作为参数传递。

bool myFunction(std::size_t n, Tile tiles[n]) {

  std::size_t z = n * sizeof(Tile);

  // etc...
}

使用 std::vectorstd::array 通常是更好的解决方案。

回答我自己的问题:

为什么我要发布这个答案

当时我是C++新手,其他问题都标为与此重复。因此,我猜像这样的其他问题来自 C++ 新手。这个答案将是为了那些新手的利益。

我的回答

与 Python 或 JAVA 等高级语言不同,数组的长度 而不是 与数组的内容一起存储,因此无法访问它。

因此,它必须作为单独的参数传递。它在高级语言中可能没有多大意义,但在 C 和 C++ 中都是必需的。

此外,与 Python 和 JAVA 不同,数组 不是 对象。要完全理解 C/C++ 数组,首先必须理解指针。