- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
假设我需要完成三项任务。第一个选项是这样的:
void doAllStuffInOneFunc() {
//code block for task 1
...
...
//code block for task 2
...
...
//code block for task 3
...
...
}
或者,以下内容可能更利于可读性和维护:
void doAllStuffByCallingOtherFuncs() {
doTask1();
doTask2();
doTask3();
}
我将为第二种选择支付多少费用?
最佳答案
如果代码在编译单元中是“已知”的,并且函数不是太复杂,大多数现代编译器无论如何都会内联代码。如果该函数也声明为 static
,那么它不会生成“真正的函数”。
编辑 3:
关于static
的解释:当一个自由函数(不是类的成员)可用于内联时,如果编译器不确定调用该函数的所有地方都是内联的,它也产生一个外线函数(又名“真实函数”)。
如果一个自由函数被声明为static
,它告诉编译器这个函数是“局部于这个编译单元”的,所以没有其他人会调用这个函数。如果编译器然后内联此编译单元中的所有调用,则它也不需要生成“外联”函数,因为编译器可以知道对该函数的所有调用。
另请注意,获取函数的地址也会强制编译器创建一个外联函数,因为函数指针必须指向某个地方[尽管在非常特殊的情况下,我已经看到编译器内联函数通过调用函数指针也是]
与所有性能问题一样,如果它在您的应用程序中真的很重要,那么对实际代码(及其不同变体)进行基准测试并进行分析是确保一切正常的关键。没有“这是正确答案”这样的东西,不同的编译器(在不同的平台上)具有不同的设置会做不同的事情。
编辑:除非有证据表明代码可读性差的代价是值得的,否则不要为了优化而牺牲可读性。无论如何,很少有整体代码通常对性能很重要。
Edit2:如果您还可以在其他函数中重用某些代码,那将是一个额外的好处。但是,通常,使代码可读性是首先拆分为函数的关键目标。
关于c++ - 一般来说,大量的小函数调用会损害性能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16421895/
给定一种支持通过列表进行迭代的编程语言,即 for element in list do ... 如果我们有一个将动态数量的列表作为输入的程序,list[1] ... list[n](其中 n
我有一个小难题。众所周知,按类型定义变量并避免使用变体是最明显的性能技巧。问题是我正在尝试编写一个可以处理隐式类型参数(基本上是变体)的例程库。 举个例子: Sub Test(A As String)
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 8 年前。 Improve this ques
我目前正在使用 Java,所以我更想知道就效率而言,直接插入它是否更好。尽管我也很好奇这是否是一种不好的做法。 最佳答案 不需要。 API 会告诉您它是否已经存在(如果您需要知道),并且 Collec
假设我需要完成三项任务。第一个选项是这样的: void doAllStuffInOneFunc() { //code block for task 1 ... ...
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我不确定这是最好的例子,但这里是。假设我想在 Android 应用程序中将对象绘制到 Canvas 上。我需要做一些数学运算并调用一个方法来返回屏幕大小以确定在哪里绘制它,因为我的应用程序应该支持多个
在下面的选项中,有没有正确的方法来处理使用条件变量时的虚假唤醒? 1) 使用 bool 值将 wait(unique_lock_ul) 放入无限的 while 循环中 unique_lock ul(m
我遇到了连接问题:取回太多记录。我在连接集中添加了一个表,并扩展了行数。通常发生这种情况时,我会选择连接中涉及的所有 ID 字段。这样一来,扩展发生的位置就很明显了,我可以更改连接的 ON 来修复它。
我敢肯定,这个问题不仅只有 1 个答案,而且游戏引擎是否真的会更改内存中的 vector ,或使用 gltransformations?因为一直推和弹出矩阵似乎效率低下,但如果你不断修改vertici
我对程序员在 C 和 C++ 中进行不同编码的基本方式有点模糊。特别是一件事是 C++ 中的字符串在 char 数组上的使用,反之亦然。那么,一般来说,我应该使用字符串还是字符数组,为什么? 最佳答案
当我尝试使用接受“通用迭代器”的 ctor 编写 C++ 类模板时,就会出现这个问题。我不知道这里用general这个词是否合适,但我的意思是它可以像STL容器一样接受迭代器。 换句话说,我对迭代器感
修复警告的短期烦恼是否可以从长远来看支付红利?这样做通常可以避免哪些类型的运行时错误? 最佳答案 我的观点是警告是有原因的,忽略它们会带来危险。虽然有些人真的很挑剔,但在大多数情况下,他们这样做是有充
假设第三方 javascript(不是 NodeJS)模块中有这样的函数: Api.IoAsync(parameter, function(err, message) { ... }) 我想将其转换为
给定任何容器类型,我们可以形成(以元素为中心的) zipper ,并且知道这个结构是一个 Comonad。最近在 another Stack Overflow question 中详细探讨了以下类型:
假设我正在构建一个 Python 程序,一开始我导入了两个模块 - 默认情况下包含在 python 库中的 something 和 somethingElse强>,但事实并非如此。 我有两个几乎相同的
我见过的大多数东西都只是使用最大概率,这看起来不错,但并没有给你任何信心的迹象。相对概率也应该很重要,对吧?让我解释一下: 对于二元分类器,假设您的类别是 A 和 B。 P(A) = 0.01、P(B
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 4 年前。 Improv
所以让我们考虑我们有一个父类 class Parent { }; 我有两个 child 类(class) class Child1 : public Parent { void AccessFunc
我刚刚在几个人的帮助下学习外部 CSS。我正在尝试比较两张纸并将其合并为一张,但因为是 2 个人写的,所以我需要整理出他们为 ID 和类提供的名称。一张纸变得非常广泛,但另一张纸有一些我想保留的更新信
我是一名优秀的程序员,十分优秀!