如何通过C++代码获取glm::vec3数组的元素个数
错误原因
你之前两种写法拿不到正确结果的原因非常明确:
cubePositions->length()实际调用的是数组首元素(第一个glm::vec3对象)的成员方法length(),该方法返回的是单个三维向量的分量个数(x/y/z共3个分量,所以返回3),和数组长度没有任何关系。glm::length()是GLM库专门用来计算向量模长、矩阵维度的工具函数,仅接受GLM定义的向量、矩阵类型参数,传入原生C风格数组不符合参数签名要求,会直接触发编译错误。
解决方案
根据你使用的C++标准版本,选对应写法即可:
全C++版本通用写法(无版本依赖)
利用原生数组的内存大小计算元素个数,逻辑是「整个数组占用的总内存字节数 / 单个元素占用的内存字节数 = 元素总个数」。
size_t cubeCount = sizeof(cubePositions) / sizeof(cubePositions[0]);
针对你给出的数组,计算结果为10,符合预期。
注意:该写法仅在数组定义的当前作用域有效,一旦数组作为参数传入函数退化为指针,
sizeof拿到的是指针本身的内存大小,计算结果会完全错误。
C++17及以上版本推荐写法(类型安全)
使用标准库提供的std::size工具函数,该函数对原生数组会自动计算正确长度,若传入退化后的指针会直接触发编译报错,避免隐式bug,使用前需要引入头文件<iterator>:
#include <iterator> // ... size_t cubeCount = std::size(cubePositions);
长期维护推荐写法(无退化风险)
如果需要跨作用域传递该数组,不要用原生C风格数组,直接改用标准库容器,从根源上避免数组长度计算错误、数组退化问题:
// 定长场景用std::array #include <array> std::array<glm::vec3, 10> cubePositions = { glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(2.0f, 5.0f, -15.0f), glm::vec3(-1.5f, -2.2f, -2.5f), glm::vec3(-3.8f, -2.0f, -12.3f), glm::vec3(2.4f, -0.4f, -3.5f), glm::vec3(-1.7f, 3.0f, -7.5f), glm::vec3(1.3f, -2.0f, -2.5f), glm::vec3(1.5f, 2.0f, -2.5f), glm::vec3(1.5f, 0.2f, -1.5f), glm::vec3(-1.3f, 1.0f, -1.5f) }; size_t cubeCount = cubePositions.size(); // 任意作用域调用都能拿到正确结果
如果后续需要动态增删元素,直接把std::array换成std::vector<glm::vec3>即可,同样通过size()方法拿元素个数。
内容的提问来源于stack exchange,提问作者user16095902
相关产品推荐
相关产品推荐

