C++的new有一个选项可以在分配失败时返回空指针而不是抛出bad_alloc异常。Foo*pf=new(std::nothrow)Foo(1,2,3);(是的,我知道这只会阻止new抛出bad_alloc;它不会阻止Foo的构造函数抛出异常。)如果您想使用共享指针而不是原始指针,您通常应该使用make_shared,因为它可以巧妙地分配控制block。autopf=std::make_shared(1,2,3);make_shared封装了新版本,这使得(?)无法选择nothrow版本。因此,您似乎必须放弃make_shared并明确调用new。std::shared_ptrpf(n
C++的new有一个选项可以在分配失败时返回空指针而不是抛出bad_alloc异常。Foo*pf=new(std::nothrow)Foo(1,2,3);(是的,我知道这只会阻止new抛出bad_alloc;它不会阻止Foo的构造函数抛出异常。)如果您想使用共享指针而不是原始指针,您通常应该使用make_shared,因为它可以巧妙地分配控制block。autopf=std::make_shared(1,2,3);make_shared封装了新版本,这使得(?)无法选择nothrow版本。因此,您似乎必须放弃make_shared并明确调用new。std::shared_ptrpf(n
是否可以即时声明新类型(空结构体或没有实现的结构体)?例如constexprautomake_new_type()->???;usingA=decltype(make_new_type());usingB=decltype(make_new_type());usingC=decltype(make_new_type());static_assert(!std::is_same::value,"");static_assert(!std::is_same::value,"");static_assert(!std::is_same::value,"");“手动”解决方案是template
是否可以即时声明新类型(空结构体或没有实现的结构体)?例如constexprautomake_new_type()->???;usingA=decltype(make_new_type());usingB=decltype(make_new_type());usingC=decltype(make_new_type());static_assert(!std::is_same::value,"");static_assert(!std::is_same::value,"");static_assert(!std::is_same::value,"");“手动”解决方案是template
所以thisanswer让我想到了将new的结果分配给指向const的指针的场景。AFAIK,在这种情况下,您没有理由不能合法const_castconstness并实际修改对象:structX{intx;};//....constX*x=newX;const_cast(x)->x=0;//okay但后来我想-如果你真的想要new创建一个const对象怎么办。所以我尝试了structX{};//....constX*x=newconstX;它编译好了!!!这是GCC扩展还是标准行为?我在实践中从未见过这种情况。如果它是标准的,我会尽可能开始使用它。 最佳答案
所以thisanswer让我想到了将new的结果分配给指向const的指针的场景。AFAIK,在这种情况下,您没有理由不能合法const_castconstness并实际修改对象:structX{intx;};//....constX*x=newX;const_cast(x)->x=0;//okay但后来我想-如果你真的想要new创建一个const对象怎么办。所以我尝试了structX{};//....constX*x=newconstX;它编译好了!!!这是GCC扩展还是标准行为?我在实践中从未见过这种情况。如果它是标准的,我会尽可能开始使用它。 最佳答案
PowerPC分支只有24位可用于目标偏移量,因此如果文本部分变得太大,一端的分支将无法到达另一端的目标。有更长的指令序列可以到达更远的目标(偏移量是32位而不是24位),但GCC默认不使用它,除非您将其传递给-mlongcall选项。然而,即使打开了这个选项,GCC仍然会为某些函数生成短调用,即operatornew和operatordelete例如,给定以下代码:externvoidfoo();intmain(intargc,char**argv){foo();newchar;}正常运行GCC将生成程序集:bl_Z3foov//voidfoo()bl_Znwj//operatorn
PowerPC分支只有24位可用于目标偏移量,因此如果文本部分变得太大,一端的分支将无法到达另一端的目标。有更长的指令序列可以到达更远的目标(偏移量是32位而不是24位),但GCC默认不使用它,除非您将其传递给-mlongcall选项。然而,即使打开了这个选项,GCC仍然会为某些函数生成短调用,即operatornew和operatordelete例如,给定以下代码:externvoidfoo();intmain(intargc,char**argv){foo();newchar;}正常运行GCC将生成程序集:bl_Z3foov//voidfoo()bl_Znwj//operatorn
由于C++别名规则,您不能随意将(一个int*)指向char数组,这似乎达成了一些共识。从另一个问题——Genericchar[]basedstorageandavoidingstrict-aliasingrelatedUB--似乎允许通过placementnew(重新)使用存储。alignas(int)charbuf[sizeof(int)];voidf(){//turnthememoryintoanint:(??)fromthePOVoftheabstractmachine!::new(buf)int;//isthisstrictlyrequired?(aside:it'sobvi
由于C++别名规则,您不能随意将(一个int*)指向char数组,这似乎达成了一些共识。从另一个问题——Genericchar[]basedstorageandavoidingstrict-aliasingrelatedUB--似乎允许通过placementnew(重新)使用存储。alignas(int)charbuf[sizeof(int)];voidf(){//turnthememoryintoanint:(??)fromthePOVoftheabstractmachine!::new(buf)int;//isthisstrictlyrequired?(aside:it'sobvi