jjzjj

c++ - 在 MSVC ABI 中,如何可靠地找到仅给出 (void*) 的 vtable?

这个问题专门针对不可移植的MSVCABI内容。我正在尝试用显然不可移植但不神奇的C++编写与C++的typeid等效的代码。对于ItaniumABI(在Linux/Mac上使用),它非常简单:conststd::type_info&dynamicast_typeid(void*mdo){std::type_info**vptr=*reinterpret_cast(mdo);std::type_info*typeinfo_ptr=vptr[-1];return*typeinfo_ptr;}所以现在我正在查看64位MSVCABI,该死的,我被难住了。对于非常简单的类,即以偏移量0处的vfp

c++ - Itanium 和 MSVC ABI 中跨模块边界的 RTTI

我正在阅读ItaniumABI上面写着Itisintendedthattwotype_infopointerspointtoequivalenttypedescriptionsifandonlyifthepointersareequal.Animplementationmustsatisfythisconstraint,e.g.byusingsymbolpreemption,COMDATsections,orothermechanisms.有谁知道在使用动态加载库时如何在流行平台(例如使用GCC和GNUbinutils的Linux)上实际实现这一点的详细信息?它有多可靠?此外,我的印象

c++ - 可以使用内联命名空间来保持共享库的向后兼容性吗?

C++内联命名空间的基本原理是源代码和二进制兼容性(请参阅HerbSutter的论文,链接在N2535中),但我无法找到保持现有二进制兼容性的好例子引入内联命名空间时的库,或者如果可能的话。(有关更多信息和源兼容性示例,请参阅thisquestion)(解决一个相关问题,使用inlinenamespace引入不兼容,参见thisquestion)如果这是我们当前的库(例如mylib.dll),它与客户共享并且需要稳定:structModelA{/*(...)lotsofstuff*/};structModelB{/*(...)lotsofstuff*/};我们能否在不破坏客户端的情况下

c++ - std::string & 作为 gcc 5 中的模板参数和 abi_tag

考虑以下代码(test1.cpp):#includeexternstd::stringtest_string;templateclasstest{public:staticvoidbar(){}};std::stringtest_string("teststring");voidfoo(){test::bar();}现在让我们交换最后两行代码(test2.cpp)的顺序:#includeexternstd::stringtest_string;templateclasstest{public:staticvoidbar(){}};voidfoo(){test::bar();}std::

c++ - 优化处理标签(空结构)函数参数

在某些情况下,我们使用标签来区分功能。标签通常是一个空结构:structTag{};假设我有一个函数,它使用这个标签:voidfunc(Tag,inta);现在,让我们调用这个函数:func(Tag(),42);并检查生成的x86-64反汇编,godbolt:movedi,42jmpfunc(Tag,int)#TAILCALL很好,标签被完全优化掉了:没有为它分配寄存器/堆栈空间。但是,如果我查看其他平台,就会发现该标签存在。在ARM上,r0被用作标签,它被清零(似乎没有必要):movr1,#42movr0,#0bfunc(Tag,int)在MSVC中,ecx被用作标签,并且它是从堆栈

c++ - 将右值传递给非引用参数,为什么编译器不能删除拷贝?

structBig{inta[8];};voidfoo(Biga);BiggetStuff();voidtest1(){foo(getStuff());}编译(在Linux上使用clang6.0.0forx86_64,所以SystemVABI,标志:-O3-march=broadwell)到test1():#@test1()subrsp,72leardi,[rsp+40]callgetStuff()vmovupsymm0,ymmwordptr[rsp+40]vmovupsymmwordptr[rsp],ymm0vzerouppercallfoo(Big)addrsp,72ret如果我没

c++ - 未使用的私有(private)虚拟方法是否允许在不破坏 ABI 兼容性的情况下进行 future 扩展?

我正在开发一个共享库。假设我有以下类定义:classMyClass{public://publicinterfaceprivate:virtualvoidfoo1(int);virtualvoidfoo2(int,bool);virtualvoidfoo3(double);virtualvoidreserved1();virtualvoidreserved2();virtualvoidreserved3();classImpl;Impl*impl_;};reserved#虚拟方法不会在客户端代码中被覆盖,也不会从任何地方调用。它们充当future扩展的占位符。假设我将其中一个保留方法替

c++ - 什么是 ABI,为什么 C++ 没有标准的 ABI,如果有又有什么关系呢?

什么是ABI,为什么C++没有标准的ABI,如果有它为什么重要? 最佳答案 ABI是一个ApplicationBinaryInterface.它描述了如何组织和访问应用程序二进制文件的标准。标准化将允许多个编译器构建彼此完全兼容的二进制文件,或者可能允许单个可执行文件在各种平台上运行而无需重新编译等。 关于c++-什么是ABI,为什么C++没有标准的ABI,如果有又有什么关系呢?,我们在StackOverflow上找到一个类似的问题: https://stac

c++ - 为什么依赖的应用程序要使用与动态库相同的编译器?

最近我不得不编译Qt,说明中清楚地提到我的应用程序应该使用与我编译Qt时使用的相同的编译器进行编译。现在我不明白这是为什么,想知道这是特定于Qt还是通用C++的东西? 最佳答案 简介Objectfilesandstaticlibrariescreatedwithdifferentcompilers,orevenwithsignificantlydifferentreleasesofthesamecompiler,oftencannotbelinkedtogether.ThisissueisnotspecifictoMinGW:man

c++ - 我可以在 DLL 中组织类吗?

关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭6年前。Improvethisquestion我承认这个问题听起来很笼统。但毕竟,从DLL导出类是一个普遍而困难的话题,坦率地说,我目前在一个相当普遍的层面上感到困惑。简短的问题:C++和DLL中的面向对象编程如何结合在一起?长题:看完this和this,我有点失望和困惑,因为我想知道如果DLL边界不允许共享对象(假设两个DLL使用了不同的编译器或编译器版本),面向对象编程如何与DLL一起工作。导出类的唯一选项是这些(如here或here所述):导出