- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 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/
我想成为 Spark 纱客户(link)。是否需要安装hadoop?还是只安装 yarn 可以吗? (by this link) 最佳答案 No Spark不需要Hadoop即可运行。 Apache
我是一名优秀的程序员,十分优秀!