草庐IT

ABI 错位名称中的 C++ 模板参数依赖 decltype

考虑以下函数:templateautoMin(A&&a,B&&b)->decltype(a(a):std::forward(b)){returna(a):std::forward(b);}片段Min(0,1)导致模板被实例化为Min.奇怪的是,Min的错误名称我的代码使用g++和clang是_Z3MinIiiEDTqultfp_fp0_cl7forwardIT_Efp_Ecl7forwardIT0_Efp0_EEOS0_OS1_(又名:decltype(({parm#1})({parm#1})):((forward)({parm#2})))Min(int&&,int&&))。换句话说,

ABI 错位名称中的 C++ 模板参数依赖 decltype

考虑以下函数:templateautoMin(A&&a,B&&b)->decltype(a(a):std::forward(b)){returna(a):std::forward(b);}片段Min(0,1)导致模板被实例化为Min.奇怪的是,Min的错误名称我的代码使用g++和clang是_Z3MinIiiEDTqultfp_fp0_cl7forwardIT_Efp_Ecl7forwardIT0_Efp0_EEOS0_OS1_(又名:decltype(({parm#1})({parm#1})):((forward)({parm#2})))Min(int&&,int&&))。换句话说,

c++ - 'Guaranteed Copy Elision' (P0135, C++1z) 是否可能需要 ABI 损坏?

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0135r0.html2016年6月在芬兰奥卢举行的session上,上述关于“保证复制省略”的提案被投票纳入C++工作文件,然后被投票作为委员会草案发布。希望这会导致明年作为C++17标准发布。该提案阐明了涉及临时对象的各种值类别,以强制在某些用例中不调用复制构造函数。我的问题是“这个新要求可能会破坏以前在这些情况下可能没有进行复制省略的编译器的ABI兼容性,或者以与新要求不兼容的方式实现它?"我正在考虑诸如初始化之类的事情,当对象的创建可以内联时会省略拷贝,但在跨越编译

c++ - 'Guaranteed Copy Elision' (P0135, C++1z) 是否可能需要 ABI 损坏?

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/p0135r0.html2016年6月在芬兰奥卢举行的session上,上述关于“保证复制省略”的提案被投票纳入C++工作文件,然后被投票作为委员会草案发布。希望这会导致明年作为C++17标准发布。该提案阐明了涉及临时对象的各种值类别,以强制在某些用例中不调用复制构造函数。我的问题是“这个新要求可能会破坏以前在这些情况下可能没有进行复制省略的编译器的ABI兼容性,或者以与新要求不兼容的方式实现它?"我正在考虑诸如初始化之类的事情,当对象的创建可以内联时会省略拷贝,但在跨越编译

c++ - C++ 标准是否保证函数返回值具有常量地址?

考虑这个程序:#includestructS{S(){print();}voidprint(){printf("%p\n",(void*)this);}};Sf(){return{};}intmain(){f().print();}据我所知,这里只构造了一个S对象。不会发生复制删除:首先没有要删除的复制,实际上,如果我明确删除复制和/或移动构造函数,编译器会继续接受程序。但是,我看到打印了两个不同的指针值。发生这种情况是因为我平台的ABI在CPU寄存器中返回可复制的类型,例如这种类型,因此该ABI无法避免复制。即使完全优化函数调用,clang也会保留这种行为。如果我给S一个重要的复制构

c++ - C++ 标准是否保证函数返回值具有常量地址?

考虑这个程序:#includestructS{S(){print();}voidprint(){printf("%p\n",(void*)this);}};Sf(){return{};}intmain(){f().print();}据我所知,这里只构造了一个S对象。不会发生复制删除:首先没有要删除的复制,实际上,如果我明确删除复制和/或移动构造函数,编译器会继续接受程序。但是,我看到打印了两个不同的指针值。发生这种情况是因为我平台的ABI在CPU寄存器中返回可复制的类型,例如这种类型,因此该ABI无法避免复制。即使完全优化函数调用,clang也会保留这种行为。如果我给S一个重要的复制构

c++ - 处理 libc++ 和较旧的 libstdc++ 之间的 ABI 差异的好方法是什么?

在Mac上处理libc++和stdlibc++之间的ABI不一致的好方法是什么(如果有)?问题:许多c++11功能需要C++标准库的新libc++实现。但是libc++与旧的libstdc++不兼容ABI,而目前大多数软件通常链接到后者。例如,系统编译器仍然使用stdlibc++,这意味着我所有使用macports安装的库对于像字符串这样的标准类都有不同的ABI,并且无法与大量使用c++11的项目链接。我目前的解决方案:保留两个版本的库,这通常会导致问题(boost、opencv等)并链接到适当的版本。我想有人可能会建议,如果我真的想使用libc++,我应该使用stdlibc++清除我

c++ - 处理 libc++ 和较旧的 libstdc++ 之间的 ABI 差异的好方法是什么?

在Mac上处理libc++和stdlibc++之间的ABI不一致的好方法是什么(如果有)?问题:许多c++11功能需要C++标准库的新libc++实现。但是libc++与旧的libstdc++不兼容ABI,而目前大多数软件通常链接到后者。例如,系统编译器仍然使用stdlibc++,这意味着我所有使用macports安装的库对于像字符串这样的标准类都有不同的ABI,并且无法与大量使用c++11的项目链接。我目前的解决方案:保留两个版本的库,这通常会导致问题(boost、opencv等)并链接到适当的版本。我想有人可能会建议,如果我真的想使用libc++,我应该使用stdlibc++清除我

c++ - 在当前 Linux 发行版上打包 C++11 软件是否安全?

作为Linux发行版的下游维护者,我通常维护的一些包开始在其代码库中使用C++11功能。它们都依赖于Linux发行版打包的不同库。ProblemswiththeABI在将C++11代码与C++98和AFAIK混合时可能会出现,当前大多数主要的Linux发行版在编译软件生成包时默认情况下都没有启用C++11标志。问题是:主要的Linux发行版是如何处理C++11代码的输入的?在使用系统库时,是否有适当的方法来检查或避免ABI的这些问题?谢谢。 最佳答案 除了C++11可以激发二进制更改之外,该问题与C++11与C++98无关。由C++

c++ - 在当前 Linux 发行版上打包 C++11 软件是否安全?

作为Linux发行版的下游维护者,我通常维护的一些包开始在其代码库中使用C++11功能。它们都依赖于Linux发行版打包的不同库。ProblemswiththeABI在将C++11代码与C++98和AFAIK混合时可能会出现,当前大多数主要的Linux发行版在编译软件生成包时默认情况下都没有启用C++11标志。问题是:主要的Linux发行版是如何处理C++11代码的输入的?在使用系统库时,是否有适当的方法来检查或避免ABI的这些问题?谢谢。 最佳答案 除了C++11可以激发二进制更改之外,该问题与C++11与C++98无关。由C++