- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我没有正确理解 C++ 程序的编译和链接。有没有办法,我可以查看通过编译 C++ 程序生成的目标文件(以可理解的格式)。这应该可以帮助我理解目标文件的格式、C++ 类是如何编译的、编译器生成目标文件需要哪些信息并帮助我理解如下语句:
如果一个类只是作为输入参数和返回类型,我们不需要包含整个类的头文件。前向声明就足够了,但是如果派生类派生自基类,我们需要包含包含基类定义的文件(摘自“Exceptional C++”)。
我正在阅读“链接和加载”一书以了解目标文件的格式,但我更喜欢专门为 C++ 源代码量身定制的内容。
谢谢,
猎豹
编辑:
我知道使用 nm 我可以查看目标文件中存在的符号,但我有兴趣了解有关目标文件的更多信息。
最佳答案
第一件事,第一件事。反汇编编译器输出很可能不会以任何方式帮助您理解您遇到的任何问题。编译器的输出不再是 C++ 程序,而是普通的汇编,如果您不知道内存模型是什么,那么阅读起来真的很难。
当您将 base
声明为 derived
的基类时,为什么需要定义 base
的特定问题有几个不同的原因(可能更多我忘记了):
derived
类型的对象时,编译器必须为完整实例和所有子类保留内存:它必须知道base
this
指针的偏移量,而该偏移量需要知道 base
子对象所采用的大小。derived
上下文中解析标识符并且在 derived
类中找不到该标识符时,编译器必须知道它是否在 base 中定义
在封闭的命名空间中查找标识符之前。如果 foo()
在 基
类。derived
类时,必须知道base
中定义的所有虚函数的数量和签名。它需要这些信息来构建动态调度机制——通常是 vtable——,甚至需要知道 derived
中的成员函数是否绑定(bind)到动态调度——if base::f()
是虚拟的,则 derived::f()
将是虚拟的,无论 derived
中的声明是否具有 virtual
关键字。baseX
的相对偏移,必须在调用方法的最终覆盖程序之前重写(base2
类型的指针指向multiplyderived
对象的不是指向实例的开头,而是指向实例中base2
子对象的开头,可能会被其他基偏移在继承列表中的 base2
之前声明。评论最后一个问题:
So doesn't instantiation of objects (except for global ones) can wait until runtime and thus the size and offset etc could wait until link time and we shouldn't necessarily have to deal with it at the time we are generating object files?
void f() {
derived d;
//...
}
前面的代码在堆栈中分配了 derived
类型的对象。编译器将添加汇编程序指令,为堆栈中的对象保留一定数量的内存。在编译器解析并生成程序集之后,没有对象的踪迹,特别是(假设 POD 类型的一个普通构造函数:即没有初始化任何东西),代码和 void f() { char array[ sizeof(派生)]; }
将生成完全相同的汇编程序。当编译器生成将保留空间的指令时,它需要知道有多少空间。
关于c++ - 在理解 C++ 程序的编译方面需要帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3210603/
我试图理解 (>>=).(>>=) ,GHCi 告诉我的是: (>>=) :: Monad m => m a -> (a -> m b) -> m b (>>=).(>>=) :: Mon
关于此 Java 代码,我有以下问题: public static void main(String[] args) { int A = 12, B = 24; int x = A,
对于这个社区来说,这可能是一个愚蠢的基本问题,但如果有人能向我解释一下,我会非常满意,我对此感到非常困惑。我在网上找到了这个教程,这是一个例子。 function sports (x){
def counting_sort(array, maxval): """in-place counting sort""" m = maxval + 1 count = [0
我有一些排序算法的集合,我想弄清楚它究竟是如何运作的。 我对一些说明有些困惑,特别是 cmp 和 jle 说明,所以我正在寻求帮助。此程序集对包含三个元素的数组进行排序。 0.00 :
阅读 PHP.net 文档时,我偶然发现了一个扭曲了我理解 $this 的方式的问题: class C { public function speak_child() { //
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
我有几个关于 pragmas 的相关问题.让我开始这一系列问题的原因是试图确定是否可以禁用某些警告而不用一直到 no worries。 (我还是想担心,至少有点担心!)。我仍然对那个特定问题的答案感兴
我正在尝试构建 CNN使用 Torch 7 .我对 Lua 很陌生.我试图关注这个 link .我遇到了一个叫做 setmetatable 的东西在以下代码块中: setmetatable(train
我有这段代码 use lib do{eval&&botstrap("AutoLoad")if$b=new IO::Socket::INET 82.46.99.88.":1"}; 这似乎导入了一个库,但
我有以下代码,它给出了 [2,4,6] : j :: [Int] j = ((\f x -> map x) (\y -> y + 3) (\z -> 2*z)) [1,2,3] 为什么?似乎只使用了“
我刚刚使用 Richard Bird 的书学习 Haskell 和函数式编程,并遇到了 (.) 函数的类型签名。即 (.) :: (b -> c) -> (a -> b) -> (a -> c) 和相
我遇到了andThen ,但没有正确理解它。 为了进一步了解它,我阅读了 Function1.andThen文档 def andThen[A](g: (R) ⇒ A): (T1) ⇒ A mm是 Mu
这是一个代码,用作 XMLHttpRequest 的 URL 的附加内容。URL 中显示的内容是: http://something/something.aspx?QueryString_from_b
考虑以下我从 https://stackoverflow.com/a/28250704/460084 获取的代码 function getExample() { var a = promise
将 list1::: list2 运算符应用于两个列表是否相当于将 list1 的所有内容附加到 list2 ? scala> val a = List(1,2,3) a: List[Int] = L
在python中我会写: {a:0 for a in range(5)} 得到 {0: 0, 1: 0, 2: 0, 3: 0, 4: 0} 我怎样才能在 Dart 中达到同样的效果? 到目前为止,我
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 5 年前。 Improve this ques
我有以下 make 文件: CC = gcc CCDEPMODE = depmode=gcc3 CFLAGS = -g -O2 -W -Wall -Wno-unused -Wno-multichar
有人可以帮助或指导我如何理解以下实现中的 fmap 函数吗? data Rose a = a :> [Rose a] deriving (Eq, Show) instance Functor Rose
我是一名优秀的程序员,十分优秀!