sizeof的这两种用法之间有区别吗?

时间:2014-03-16 22:00:20

标签: c++ sizeof

我想为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
};

4 个答案:

答案 0 :(得分:2)

表达式sizeof *possizeof(*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将返回系统上指针的大小。