愚蠢的问题,但是每当你调用new时,你总是有一个指针吗?SomeClass*person=newSomeClass();那是因为您需要一个指针来指向为SomeClass变量person分配的新内存空间吗?谢谢! 最佳答案 如果new成功完成,它总是返回一个指针(如果没有成功完成,抛出异常,不返回任何内容)。指针指向已创建的对象,或者在数组的情况下,指向数组第一个元素的指针。 关于c++-c++中的"new"运算符,指针问题,我们在StackOverflow上找到一个类似的问题:
出于效率原因,我总是避免编写这样的循环:for(std::size_ti=0;i其中vec是一个STL容器。相反,我要么做conststd::size_tvec_size=vec.size();for(std::size_ti=0;i或使用容器迭代器。但第一个解决方案真的有多糟糕?我记得在Meyers中读到它将是二次的而不是线性的,因为vector不知道它的大小并且必须反复计数。但是现代编译器不会检测到这一点并对其进行优化吗? 最佳答案 vector::size()是恒定时间的,通常实现为经过优化的简单内联函数。不要费心手动优化它。
出于效率原因,我总是避免编写这样的循环:for(std::size_ti=0;i其中vec是一个STL容器。相反,我要么做conststd::size_tvec_size=vec.size();for(std::size_ti=0;i或使用容器迭代器。但第一个解决方案真的有多糟糕?我记得在Meyers中读到它将是二次的而不是线性的,因为vector不知道它的大小并且必须反复计数。但是现代编译器不会检测到这一点并对其进行优化吗? 最佳答案 vector::size()是恒定时间的,通常实现为经过优化的简单内联函数。不要费心手动优化它。
看起来operatornew和operatornew[]具有完全相同的签名:void*operatornew(size_tsize);void*operatornew[](size_tsize);并做同样的事情:要么返回一个指向足够大的原始(未以任何方式初始化)内存块的指针,要么抛出异常。当我使用new和operatornew[]创建对象时,operatornew也会在内部调用-当我创建对象数组时使用new[]。上述两个特殊函数在C++内部以完全相同的方式调用,我看不出这两个调用有什么不同的含义。让两个不同的函数具有完全相同的签名和完全相同的行为的目的是什么?
看起来operatornew和operatornew[]具有完全相同的签名:void*operatornew(size_tsize);void*operatornew[](size_tsize);并做同样的事情:要么返回一个指向足够大的原始(未以任何方式初始化)内存块的指针,要么抛出异常。当我使用new和operatornew[]创建对象时,operatornew也会在内部调用-当我创建对象数组时使用new[]。上述两个特殊函数在C++内部以完全相同的方式调用,我看不出这两个调用有什么不同的含义。让两个不同的函数具有完全相同的签名和完全相同的行为的目的是什么?
小心,我们正在绕过巨龙的巢穴。考虑以下两个类:structBase{std::stringconst*str;};structFoo:Base{Foo(){std::cout如您所见,我正在访问一个未初始化的指针。还是我?假设我只使用trivial的Base类,只不过是(可能嵌套的)指针包。static_assert(std::is_trivial{},"!");我想分三步构造Foo:为Foo分配原始存储通过placement-new初始化一个适当放置的Base子对象通过placement-new构造Foo。我的实现如下:std::unique_ptrmakeFooWithBase(s
小心,我们正在绕过巨龙的巢穴。考虑以下两个类:structBase{std::stringconst*str;};structFoo:Base{Foo(){std::cout如您所见,我正在访问一个未初始化的指针。还是我?假设我只使用trivial的Base类,只不过是(可能嵌套的)指针包。static_assert(std::is_trivial{},"!");我想分三步构造Foo:为Foo分配原始存储通过placement-new初始化一个适当放置的Base子对象通过placement-new构造Foo。我的实现如下:std::unique_ptrmakeFooWithBase(s
placementnew的返回值与其操作数的强制转换值之间是否存在(语义)差异?structFoo{...};charbuffer[...];Foo*a=new(buffer)Foo;Foo*b=reinterpret_cast(buffer);a和b有什么不同吗?编辑:根据DaBler的评论,如果使用const/reference成员,这个问题表明存在差异:Placementnewandassignmentofclasswithconstmember所以,我的一点更新问题:a和b是否有任何不同,如果Foo没有const或引用成员? 最佳答案
placementnew的返回值与其操作数的强制转换值之间是否存在(语义)差异?structFoo{...};charbuffer[...];Foo*a=new(buffer)Foo;Foo*b=reinterpret_cast(buffer);a和b有什么不同吗?编辑:根据DaBler的评论,如果使用const/reference成员,这个问题表明存在差异:Placementnewandassignmentofclasswithconstmember所以,我的一点更新问题:a和b是否有任何不同,如果Foo没有const或引用成员? 最佳答案
以下代码在gcc4.8和Clang3.2下编译:intmain(){intsize=10;intarr[size];}C++标准的8.3.4/1规定数组的大小必须是一个整数常量表达式,而size似乎不是。这是两个编译器中的错误,还是我遗漏了什么?最新的VC++CTP拒绝带有这个有趣消息的代码:errorC2466:cannotallocateanarrayofconstantsize0有趣的部分是它似乎认为size为零。但至少它拒绝了代码。gcc和Clang不应该做同样的事情吗? 最佳答案 这是variablelengtharray