查看编译器生成的默认函数?

2023-11-26

有什么方法可以查看由 VC++2008 等编译器为未定义它们的类生成的默认函数(例如默认复制构造函数、默认赋值运算符)吗?


随着clang编译器,你可以通过传递来看到它们-ast-dump争论。 Clang 仍处于开发阶段,但您已经可以将它用于以下用途:

[js@HOST2 cpp]$ cat main1.cpp
struct A { };
[js@HOST2 cpp]$ clang++ -cc1 -ast-dump main1.cpp
typedef char *__builtin_va_list;
struct A {
public:
    struct A;
    inline A();
    inline A(struct A const &);
    inline struct A &operator=(struct A const &);
    inline void ~A();
};
[js@HOST2 cpp]$

我希望这就是你所要求的。我们修改一下代码再看一下。

[js@HOST2 cpp]$ cat main1.cpp
struct M { M(M&); };
struct A { M m; };
[js@HOST2 cpp]$ clang++ -cc1 -ast-dump main1.cpp
typedef char *__builtin_va_list;
struct M {
public:
    struct M;
    M(struct M &);
    inline struct M &operator=(struct M const &);
    inline void ~M();
};
struct A {
public:
    struct A;
    struct M m;
    inline A();
    inline A(struct A &);
    inline struct A &operator=(struct A const &);
    inline void ~A();
};
[js@HOST2 cpp]$

注意隐式声明的复制构造函数是如何A现在有一个非常量引用参数,因为它的成员之一也有(成员m), 然后M没有声明默认构造函数。

为了获得生成的代码,您可以让它发出虚拟机中间语言。让我们看看生成的代码:

struct A { virtual void f(); int a; };
A f() { A a; a = A(); return a; } // using def-ctor, assignment and copy-ctor

[js@HOST2 cpp]$ clang++ -cc1 -O1 -emit-llvm -o - main1.cpp | c++filt
[ snippet ]
define linkonce_odr void @A::A()(%struct.A* nocapture %this) nounwind align 2 {
entry:
  %0 = getelementptr inbounds %struct.A* %this, i32 0, i32 0 ; <i8***> [#uses=1]
  store i8** getelementptr inbounds ([3 x i8*]* @vtable for A, i32 0, i32 2), i8*** %0
  ret void
}

define linkonce_odr %struct.A* @A::operator=(A const&)(%struct.A* %this, 
  %struct.A* nocapture) nounwind align 2 {
entry:
  %tmp = getelementptr inbounds %struct.A* %this, i32 0, i32 1 ; <i32*> [#uses=1]
  %tmp2 = getelementptr inbounds %struct.A* %0, i32 0, i32 1 ; <i32*> [#uses=1]
  %tmp3 = load i32* %tmp2                         ; <i32> [#uses=1]
  store i32 %tmp3, i32* %tmp
  ret %struct.A* %this
}

define linkonce_odr void @A::A(A const&)(%struct.A* nocapture %this, %struct.A* nocapture) 
  nounwind align 2 {
entry:
  %tmp = getelementptr inbounds %struct.A* %this, i32 0, i32 1 ; <i32*> [#uses=1]
  %tmp2 = getelementptr inbounds %struct.A* %0, i32 0, i32 1 ; <i32*> [#uses=1]
  %tmp3 = load i32* %tmp2                         ; <i32> [#uses=1]
  store i32 %tmp3, i32* %tmp
  %1 = getelementptr inbounds %struct.A* %this, i32 0, i32 0 ; <i8***> [#uses=1]
  store i8** getelementptr inbounds ([3 x i8*]* @vtable for A, i32 0, i32 2), i8*** %1
  ret void
}

现在,我不明白中间语言(定义于llvm.org)。但您可以使用 llvm 编译器将所有代码转换为 C:

[js@HOST2 cpp]$ clang++ -cc1 -O1 -emit-llvm -o - main1.cpp | llc -march=c -o - | c++filt
[snippet]
void A::A()(struct l_struct.A *llvm_cbe_this) {
  *((&llvm_cbe_this->field0)) = ((&_ZTV1A.array[((signed int )2u)]));
  return;
}


struct l_struct.A *A::operator=(A const&)(struct l_struct.A *llvm_cbe_this, struct l_struct.A
  *llvm_cbe_tmp__1) {
  unsigned int llvm_cbe_tmp3;

  llvm_cbe_tmp3 = *((&llvm_cbe_tmp__1->field1));
  *((&llvm_cbe_this->field1)) = llvm_cbe_tmp3;
  return llvm_cbe_this;
}


void A::A(A const&)(struct l_struct.A *llvm_cbe_this, struct l_struct.A *llvm_cbe_tmp__2) {
  unsigned int llvm_cbe_tmp3;

  llvm_cbe_tmp3 = *((&llvm_cbe_tmp__2->field1));
  *((&llvm_cbe_this->field1)) = llvm_cbe_tmp3;
  *((&llvm_cbe_this->field0)) = ((&_ZTV1A.array[((signed int )2u)]));
  return;
}

田田!请注意它如何在复制构造函数和默认构造函数中设置虚拟表指针。希望这可以帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

查看编译器生成的默认函数? 的相关文章

  • 格式说明符%02x

    我有一个简单的程序 include
  • 静态构造函数和 BeforeFieldInit?

    如果类型没有静态构造函数 则将执行字段初始值设定项 就在使用该类型之前 或者在某个时间点突发奇想 运行时 为什么这段代码 void Main start Dump Test EchoAndReturn Hello end Dump clas
  • C#.Net 邮件将进入垃圾邮件文件夹

    我正在从 ASP net Web 应用程序发送电子邮件 邮件发送成功 没有失败 但大多数都进入了垃圾邮件文件夹 请帮助我克服垃圾邮件过滤器 我的发送邮件代码 public void SendMail string FromAddress s
  • EntityHydrate 任务失败

    我最近安装了 Visual Studio 11 Beta 和 Visual Studio 2010 之后 我无法在 Visual Studio 2010 中构建依赖于 PostSharp 的项目 因此我卸载了 Visual Studio 1
  • C# 中的 Stack<> 实现

    我最近一直在实现递归目录搜索实现 并且使用堆栈来跟踪路径元素 当我使用 string Join 连接路径元素时 我发现它们被颠倒了 当我调试该方法时 我查看了堆栈 发现堆栈内部数组中的元素本身是相反的 即最近 Push 的元素位于内部数组的
  • 在 Mono 中反序列化 JSON 数据

    使用 Monodroid 时 是否有一种简单的方法可以将简单的 JSON 字符串反序列化为 NET 对象 System Json 只提供序列化 不提供反序列化 我尝试过的各种第三方库都会导致 Mono Monodroid 出现问题 谢谢 f
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • Android NDK 代码中的 SIGILL

    我在市场上有一个 NDK 应用程序 并获得了有关以下内容的本机崩溃报告 SIGILL信号 我使用 Google Breakpad 生成本机崩溃报告 以下是详细信息 我的应用程序是为armeabi v7a with霓虹灯支持 它在 NVIDI
  • 用于在标头更改时重新编译的简单 C 项目的示例 makefile

    有谁有完整的 makefile 可以执行以下操作 如果 HEADER 文件发生更改 则重建项目 cpp 文件在 makefile 中列出 头文件未在 makefile 中列出 头文件允许与 cpp 文件具有不同的名称 部分cpp文件没有头文
  • 为什么这个 makefile 在“make clean”上执行目标

    这是我当前的 makefile CXX g CXXFLAGS Wall O3 LDFLAGS TARGET testcpp SRCS main cpp object cpp foo cpp OBJS SRCS cpp o DEPS SRCS
  • Linux 上的 RTLD_LOCAL 和dynamic_cast

    我们有一个由应用程序中的一些共享库构成的插件 我们需要在应用程序运行时更新它 出于性能原因 我们在卸载旧插件之前加载并开始使用新插件 并且只有当所有线程都使用旧插件完成后 我们才卸载它 由于新插件和旧插件的库具有相同的符号 我们dlopen
  • LinkLabel 无下划线 - Compact Framework

    我正在使用 Microsoft Compact Framework 开发 Windows CE 应用程序 我必须使用 LinkLabel 它必须是白色且没有下划线 因此 在设计器中 我将字体颜色修改为白色 并在字体对话框中取消选中 下划线
  • 如何在 Javascript 中连接 C# ActiveX 事件处理程序

    我尝试使用几个代码片段将 ActiveX 对象与 Javascript 事件处理程序挂钩 我无法确定为什么事件处理程序没有被调用 带有项目的 Github 存储库 https github com JesseKPhillips Csharp
  • 如何防止 Blazor NavLink 组件的默认导航

    从 Blazor 3 1 Preview 2 开始 应该可以防止默认导航行为 https devblogs microsoft com aspnet asp net core updates in net core 3 1 preview
  • 以编程方式创建 Blob 存储容器

    我有一个要求 即在创建公司时 在我的 storageaccount 中创建关联的 blob 存储容器 并将容器名称设置为传入的字符串变量 我已尝试以下操作 public void AddCompanyStorage string subDo
  • 使用 gcc 时在头文件中查找定义的好方法是什么?

    在使用 gcc 时 有人有推荐的方法在头文件中查找定义吗 使用 MSVC 时 我只需右键单击并选择 转到定义 这非常好 我使用过 netbeans gcc 它确实有代码帮助 包括到定义的超链接 所以这是一种选择 但是 我想知道是否有任何其他
  • 如何组合两个 lambda [重复]

    这个问题在这里已经有答案了 可能的重复 在 C 中组合两个 lambda 表达式 https stackoverflow com questions 1717444 combining two lamba expressions in c
  • .Net Reactive Extensions Framework (Rx) 是否考虑拓扑顺序?

    Net 反应式扩展框架是否按拓扑顺序传播通知以最大限度地减少更新量 就像 Scala Rx 所做的那样 Net 反应式扩展 Rx 是否可以 https github com lihaoyi scala rx wiki How it Work
  • 如何在 ASP.NET Core 中注入泛型的依赖关系

    我有以下存储库类 public class TestRepository Repository
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • 如何找到命名空间及其成员的所有用法?

    我正在尝试搜索一个大型解决方案以查找给定名称空间或其成员的任何用法 例如 System IO Resharper 的 查找用法 允许我查找以下内容的参考System IO 但仅在明确使用时 如果文件声明using System IO 然后使
  • 如何限制递归子目录搜索的深度

    我有一个功能 当前可以抓取所有文件夹和子文件夹来检查我正在构建的小工具的 ACL 但我正在绞尽脑汁试图弄清楚如何限制它可以达到的深度 例如 您有一个 4 层深度的文件夹 但我希望只能获取其中 3 层的 ACL 目前我已将其编码如下 priv
  • Cakephp 使用 htaccess 和 htpasswd 进行密码保护 - 如何?

    在 Cakephp 中使用 htaccess 开发期间如何使用密码保护我的网站 我必须更改哪个 htaccess 文件 我必须在 htaccess 中写什么 我应该把 htpasswd 放在哪里 我在谷歌上搜索过 但找不到任何有用的东西 我
  • 为什么 Array.prototype 返回一个空数组?

    这可能是一个愚蠢的问题 但是为什么当我控制台时我得到一个空数组Array prototype 我期待着推送和弹出方法 大多数原型的内置方法都不是可枚举的 因此如果您使用它们将不会显示for in 你不应该在数组上这样做 但这只是一个例子 由
  • 请解释一下区别

    我有一个关于二维数组的程序 基地址是8678 include
  • 如何通过 php 中的网络服务发送/获取文件

    这可能吗 发送文件的正确方法是什么 thanks 如果您希望网络服务上传 下载文件 我不知道 无论如何你可以使用curl http fr php net curl 从其他网络服务器上传 下载文件 要从用户处获取上传到 Web 服务的某些文件
  • JavaScript 音频的未来?

    我正在教孩子们如何向他们的 JavaScript 游戏和网页添加音频 我了解 HTML5 音频 API 现在刚刚了解各种浏览器的问题 令人惊讶的是 IE 根本不支持 WAV 等 不过 显然有一个新的网络音频标准我不知道 Chrome 完全支
  • 在 PHP 中显示两个日期之间的所有周数[重复]

    这个问题在这里已经有答案了 任何人都可以告诉如何在 PHP 中显示两个日期之间涵盖的所有周数 日期可能是不同的年份 如果我使用开始日期为 2011 09 16 结束日期为 2011 09 21 它将显示第 37 周和第 38 周 你可以使用
  • 从 Javascript 端调用 Qt 函数 (QWebView)

    我有一个 Qt 项目 可以将任何 HTML 页面加载到 Web 视图中 我有以下代码main cpp file include mainwindow h include
  • 如何在 iText 生成的 PDF 中添加图像到我的标题?

    我正在使用 iText 生成 PDF 我创建了一个自定义 PdfPageEventHelper 来向每个页面添加页眉 和页脚 我的问题是我不知道如何添加图像 因此它显示在 标题框 中 我只知道如何将图像添加到文档内容本身 如果有意义的话 这
  • 如何从 URL 下载文件并将其保存在 Rails 中?

    我有一个要保存在本地的图像的 URL 以便我可以使用 Paperclip 为我的应用程序生成缩略图 下载和保存图像的最佳方式是什么 我研究了 ruby 文件处理 但没有遇到任何问题 尝试这个 require open uri open im
  • C++ - 在派生类上使用的 typeid() 不返回正确的类型

    也许我误解了继承在这里的工作原理 但这是我的问题 我有一个 Option 类 以及一个从它派生的 RoomOption 类 我有另一个 Room 类 它包含一个shared ptrs 向量 在 main 中 我向该向量添加了 RoomOpt
  • “Ultra Find”的 Visual Studio 扩展发生了什么?

    Ultra Find 的 Visual Studio 扩展发生了什么 我在这个网站和互联网上看到了关于这个据称很棒的扩展的参考资料 这里有几个链接 http blog arainia com 2010 08 ultra find getti
  • 如何使用 Google Apps 脚本将公式添加到 Google 表格?

    如何添加如下公式 SUM A1 A17 使用 Google Apps Script for Google Sheets 访问一系列字段 这是使用以下方法完成的设置公式对于选定的单元格 下面是如何执行此操作的示例 var ss Spreads
  • 获取 ReferenceError:找不到变量:角度

    我对 yeoman 及其使用的所有工具都很陌生 我在 yeoman 中创建了一个测试项目 并尝试在 jasmine 中运行测试规范 我已经使用cmd安装了jasmine插件 npm 安装 grunt contrib jasmine save
  • 使用WeifenLuo DockPanel套件

    我刚刚下载了罗维芬 Dock Panel Suite 并尝试使用它 但我找不到有关如何使用它的具体文档 我已经解决了一些问题 终于有了一些开始的东西 这是我所做的 我创建了一个 ToolboxWindow 类 如下所示 Public Cla
  • C/C++ 和 Python 之间共享内存

    有没有办法共享内存以在 C C 和 python 之间共享 openCV 图像 C 中的 MAT 和 python 中的 numpy 图像 不需要多平台 我在linux中做 我认为在mmap或类似的想法之间共享 我有两个正在运行的进程 一个
  • 为什么检查 isinstance(something, Mapping) 这么慢?

    我最近比较了性能collections Counter to sorted用于比较检查 如果某些迭代包含相同数量的相同元素 而大迭代的性能Counter一般好于sorted对于短的可迭代对象来说要慢得多 Using line profile
  • Laravel-Core:为什么 Laravel 多次存储别名?

    Laravel 在 Application php 的核心中注册了很多默认实现 如下所示 url gt Illuminate Routing UrlGenerator Illuminate Contracts Routing UrlGene
  • 查看编译器生成的默认函数?

    有什么方法可以查看由 VC 2008 等编译器为未定义它们的类生成的默认函数 例如默认复制构造函数 默认赋值运算符 吗 随着clang编译器 你可以通过传递来看到它们 ast dump争论 Clang 仍处于开发阶段 但您已经可以将它用于以