传递给函数的数组对象的大小
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::array
或 std::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::vector
或 std::array
通常是更好的解决方案。
回答我自己的问题:
为什么我要发布这个答案
当时我是C++新手,其他问题都标为与此重复。因此,我猜像这样的其他问题来自 C++ 新手。这个答案将是为了那些新手的利益。
我的回答
与 Python 或 JAVA 等高级语言不同,数组的长度 而不是 与数组的内容一起存储,因此无法访问它。
因此,它必须作为单独的参数传递。它在高级语言中可能没有多大意义,但在 C 和 C++ 中都是必需的。
此外,与 Python 和 JAVA 不同,数组 不是 对象。要完全理解 C/C++ 数组,首先必须理解指针。
我是运行以下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::array
或 std::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::vector
或 std::array
通常是更好的解决方案。
回答我自己的问题:
为什么我要发布这个答案
当时我是C++新手,其他问题都标为与此重复。因此,我猜像这样的其他问题来自 C++ 新手。这个答案将是为了那些新手的利益。
我的回答
与 Python 或 JAVA 等高级语言不同,数组的长度 而不是 与数组的内容一起存储,因此无法访问它。
因此,它必须作为单独的参数传递。它在高级语言中可能没有多大意义,但在 C 和 C++ 中都是必需的。
此外,与 Python 和 JAVA 不同,数组 不是 对象。要完全理解 C/C++ 数组,首先必须理解指针。