我想为VBO分配一些空间。执行此操作的功能(在OpenGL中)是:
void glBufferData(GLenum target,
GLsizeiptr size,
const GLvoid * data,
GLenum usage);
在我阅读的教程中,大小按以下方式计算:
N_VERTS*P_SIZE*sizeof *pos,
其中N_VERTS
是顶点数,P_SIZE
是维度(2D / 3D ...)。
我正在使用:
sizeof(pos)
它们之间有区别吗?我的测试没有显示出任何差异。这又是什么意思?
sizeof *pos
我的猜测是它等于
sizeof(pos)/sizeof(float)
但我的测试显示我没有。
修改
#define N_VERTS 3
#define P_SIZE 2
float pos[N_VERTS*P_SIZE] =
{
-0.8, -0.8,
0.8, -0.8,
0.0, 0.8
};
答案 0 :(得分:2)
表达式sizeof *pos
与sizeof(*pos)
相同,并给出pos
指向的内容的大小。如果pos
是动态分配的,它将为您提供每个元素的大小。
例如:
float *pos = new float[N_VERTS * P_SIZE];
// ... fill in pos values
size = N_VERTS * P_SIZE * sizeof *pos;
将以字节为单位给出为pos
分配的内存大小。
在您的情况下,由于您的数据未动态分配,因此您可以使用sizeof pos
。
答案 1 :(得分:0)
sizeof运算符的语法按以下方式定义
sizeof unary-expression
sizeof ( type-id )
因为任何表达式都可以括在括号中,然后
sizeof unary-expression
相当于
sizeof ( unary-expression )
在您的示例中,sizeof( *pos )
是数组pos元素的大小(以字节为单位)。
表达式*pos
等同于pos[0]
,它是数组的第一个元素。
sizeof( pos )
是数组pos本身的字节大小。
sizeof( *pos )
相当于sizeof( float )
,因为sizeof( *pos )
是数组pos元素的大小,每个元素都有float类型。
所以
sizeof( pos ) / sizeof( float )
相当于
sizeof( pos ) / sizeof( *pos )
答案 2 :(得分:0)
鉴于
float arr[3];
float *p = arr;
sizeof(arr) // gives 3*sizeof(float), i.e. on a compiler using IEEE 754 floats, 12.
sizeof(p) // gives just the _pointer_ size, e.g. 4 or 8.
sizeof(*p) // gives sizeof(float), incidentally 4 as well, assuming IEEE 754 floats.
sizeof(arr[0]) // yields the float size as well, like *p.
sizeof是数组中不衰减到指针的少数几个地方之一,即使它看起来像一个函数。
我的猜测是教程是正确的;他们需要你的pos数组的大小,6 * sizeof(float)。因为pos是一个真正的数组,所以这等于sizeof(pos),我认为你使用的是什么。两种方式都是正确的。但是我发现教程的方式更安全,因为你可能会在某个时刻传递该数组,或者动态分配它,在这种情况下,你会突然处理一个尺寸较小的指针,而所有其余的代码都没有看到差别。
答案 3 :(得分:-1)
在这种情况下,sizeof * pos只有在pos是某个东西的指针时才有意义,在这种情况下,sizeof * ptr是一个常用的习惯用法,它给出了引用(指向)对象的大小。
sizeof pos只会返回指针的大小,即。不是对象大小。
编辑:在问题中添加了更多细节后,似乎pos是一个数组,在这种情况下,sizeof pos返回数组的总大小(以字节为单位)。但是,如果数组衰变为指针,sizeof将返回系统上指针的大小。