- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
在 c (或者可能是 c++) 中,有什么区别
char myarr[16]={0x00};
和
char myarr[16];memset(myarr, '\0', sizeof(myarr));
??
编辑:我问这个是因为在 vc++ 2005 中结果是一样的..
编辑更多:和
char myarr[16]={0x00,};?
最佳答案
重要的区别是第一个默认值以特定于元素的方式初始化数组:指针将接收一个 空指针值,它不需要是 0x00(如在所有位中) -zero), bool 值将是 false。如果元素类型不是所谓的POD(普通旧数据类型)的类类型,那么你只能做第一个,因为第二个只适用于最简单的情况(你没有虚拟函数、用户定义的构造函数等等)。相比之下,使用 memset 的第二种方法将数组的所有元素设置为所有位为零。这并不总是你想要的。例如,如果您的数组具有指针,则它们不一定会设置为空指针。
第一个将默认初始化数组的元素,但第一个除外,它显式设置为 0。如果数组是本地的并且在堆栈上(也就是说,不是静态的),编译器内部通常会执行一个 memset 来清除数组。如果数组是非本地的或静态的,第一个版本可能效率更高。编译器可以在编译时将初始化程序放入生成的汇编代码中,使其根本不需要运行时代码。或者,当程序以快速方式(即分页方式)启动时,可以将数组布置在自动归零的部分上(也适用于指针,如果它们具有全位零表示)。
第二个在整个数组上显式地执行 memset。优化编译器通常会将较小区域的 memset 替换为仅使用标签和分支循环的内联机器代码。
<子>这是为第一种情况生成的汇编代码。我的 gcc 的东西没有得到太多优化,所以我们真正调用了 memset(堆栈顶部的 16 个字节总是被分配,即使我们没有本地人。$n 是一个寄存器号):
void f(void) {
int a[16] = { 42 };
}
sub $29, $29, 88 ; create stack-frame, 88 bytes
stw $31, $29, 84 ; save return address
add $4, $29, 16 ; 1st argument is destination, the array.
add $5, $0, 0 ; 2nd argument is value to fill
add $6, $0, 64 ; 3rd argument is size to fill: 4byte * 16
jal memset ; call memset
add $2, $0, 42 ; set first element, a[0], to 42
stw $2, $29, 16 ;
ldw $31, $29, 84 ; restore return address
add $29, $29, 88 ; destroy stack-frame
jr $31 ; return to caller
来自 C++ 标准的血腥细节。上面的第一种情况将默认初始化剩余的元素。
8.5
:
To zero-initialize storage for an object of type T means:
- if T is a scalar type, the storage is set to the value of 0 (zero) converted to T;
- if T is a non-union class type, the storage for each nonstatic data member and each base-class subobject is zero-initialized;
- if T is a union type, the storage for its first data member is zero-initialized;
- if T is an array type, the storage for each element is zero-initialized;
- if T is a reference type, no initialization is performed.
To default-initialize an object of type T means:
- if T is a non-POD class type, the default constructor for T is called
- if T is an array type, each element is default-initialized;
- otherwise, the storage for the object is zero-initialized.
8.5.1
:
If there are fewer initializers in the list than there are members in the aggregate, then each member not explicitly initialized shall be default-initialized (8.5).
关于c++ - 在 C/C++ 中初始化和归零数组的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/453432/
平时很少在jquery中用到this。查看代码时发现用到了,就调试出this的值,心想原来如此。还是挺有用的。这里总结一下this与$(this)的区别和使用。 $(this)生成的是什么?
使用单例类和应用程序范围的托管 bean 来保存应用程序数据有区别吗? 我需要查找某些 JNDI 资源,例如远程 bean 接口(interface),因此我为自己编写了一个单例来缓存我的引用并且只允
如果您仔细查看包含的图片,您会注意到您可以使用 Eclipse IDE 重构 Groovy 代码并将方法转换为闭包,反之亦然。那么,闭包到底是什么,它与方法有什么不同呢?有人可以举一个使用闭包的好例子
vagrant box repackage有什么区别( docs ) 和 vagrant package ( docs )? 我意识到 vagrant package仅适用于 VirtualBox 提
我想看看是否有人可以解释为什么以下代码适用于 valueOf 但不适用于其他代码。 import java.math.BigDecimal; public class Change { publ
这个问题已经有答案了: 已关闭12 年前。 Possible Duplicates: What is Closures/Lambda in PHP or Javascript in layman te
This question already has answers here: Vagrant, Docker, Puppet, Chef (3个答案) 2年前关闭。 docker和chef有什么共同
以下代码在95%的机器上产生相同的输出,但是在几台机器上却有所不同。在 Debug模式下,输出: Changing from New to Fin OK 但在 Release模式下: Changing
////Creating Object var Obj; // init Object Obj= {}; 它们之间有什么区别两个? 有没有可能把它变成一个单行? 这样使用有什么好处吗?
我想找出定时器服务之间的区别。我应该使用哪个以及何时使用。我正在使用 Jboss 应用服务器。 1) java.ejb.Schedule。 @Schedule注解或配置自xml。 2) javax.e
我发现在 C++ 中可以通过三种不同的方式将对象传递给函数。假设我的类(class)是这样的: class Test { int i; public: Test(int x);
有什么区别。 public class Test { public static void main(String args[]) { String toBeCast = "c
如果我有一列,设置为主索引,设置为INT。 如果我不将其设置为自动递增,而只是将唯一的随机整数插入其中,与自动递增相比,这是否会减慢 future 的查询速度? 如果我在主索引和唯一索引为 INT 的
这两种日期格式有什么区别。第一个给出实际时间,第二个给出时间购买添加时区偏移值。 NSDateFormatter * dateFormatter = [[NSDateFormatter alloc]
如果有一个函数,请说foo: function foo() { console.log('bar'); } 那么在 JavaScript 中,从另一个函数调用一个函数有什么区别,如下所示: f
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
代码是什么: class Time { private: int hours; int minutes; int seconds; pu
我知道这是非常基本的,但有人介意解释一下这两个数组声明之间的区别吗: #include array myints; ...和: int myints[5]; ...以及为什么 myints.size
我学会了如何根据 http://reference.sitepoint.com/css/specificity 计算 css 特异性但是,基于this reference,我不明白伪类(来自c)和伪元
为什么在运行 2) 时会出现额外的空行?对我来说 1 就像 2。那么为什么 2) 中的额外行? 1) export p1=$(cd $(dirname $0) && pwd) #
我是一名优秀的程序员,十分优秀!