c - 数组初始值设定项之间的区别

标签 c arrays cocoa initialization opengl-es-2.0

我正在 C 中创建一个已知大小且永远不会改变的数组。下面两个初始化器有什么区别?

1.

GLuint boxArray[36];
for (GLuint i=0; i<36; i++) 
{
    boxArray[i] = i;
}

2.

GLuint boxArray[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35};

当我更换上面的两种方法时,只有第一种方法适用于我的代码。对数组本身的检查看起来非常相似(唯一的区别是第二种方法对于超出数组末尾的两个元素的值为零)。

我在创建数组后使用以下代码来检查数组...

for (int j=0; j<39; j++) {
    NSLog(@"boxArray[%d] = %d", j, boxArray[j]);
 }

两个输出都是相同的,只是有上述的微小差异。我故意写到数组末尾以检查那里的差异。

然后我将数组填充到一个 NSData 对象中,该对象是此代码所在对象的实例变量......就像这样......

_boxArrayData  = [NSData dataWithBytes:boxArray length:sizeof(boxArray)];

当我从 NSData 对象中提取数据时,我可以检查另一端的数据,并且那里看起来也一样。但是,当我使用数据(它是 OpenGLES2.0 的简单索引数组)时,我得到了不同的结果。

最佳答案

就编译器而言,第二个初始化器可能被视为“常量”。因此,这些值将被写入可执行文件的常量 block ,并由数组变量直接指向。

因此以下零可能是代码中某处的另一个常量值。只要您的代码没有真正更改,编译器就会将这两个值在可执行文件中并排排列。添加更多常量可能会在将来改变这种情况。

如果您进一步查看数组的内存块,您可能会看到其他常量值(包括一些可识别的字符串)...假设您的代码足够强大。

第一个初始化程序显然没有这种行为,因为内存是在堆栈上分配的,并在稍后填充。由于每次运行程序时堆栈都可以分配到不同的位置,因此堆栈顶部之后的值每次都可能不同。

总之,第二个初始化程序使您的可执行文件更大,但启动速度更快,因为它只是将变量指向常量。第一个初始化程序将使您的可执行文件缩小数组大小,但在到达代码的该部分时动态分配内存。另外,使用循环来填充它会比第二个慢很多(相对而言)。显然,36 个元素的循环仍然非常快,但简单的指针分配的周期要少得多。

关于c - 数组初始值设定项之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16975460/

相关文章:

在C中连接十六进制字节

c - C中的十六进制字符串到字节数组

python - 拆分数组时减少内存使用的最佳实践

objective-c - 是否在没有 Cocoa 的情况下使用 Objective-C?

c - 线条和纹理不会一起出现

c - 长对齐问题(MSVC vs. GCC)

php - 将嵌套数组转换为 laravel 中的特定选择框

Java - 使用 Scanner 构建对象数组

cocoa - 电子签名 Mac OS X

cocoa - 属性(property)的返回地址