You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 07:45:34