【问题标题】:Direct the compiler how to optimize my code指导编译器如何优化我的代码
【发布时间】:2012-11-11 18:20:50
【问题描述】:

我可以告诉编译器如何优化某些东西或调用什么函数。 我的意思是像创建分配方法并让编译器优化它,因为它使用mallocnew 优化它。

或者,如果在代码中某处调用了函数 X 并且未使用它的返回值,则删除此调用。 (来自.lib 的函数,编译器对此一无所知)

有这方面的选择吗?

例如:

auto val=X(); //Use the return value
X(); //Don't use
auto t=allocate<T>(); //Allocate on heap
t->Show(val); //Run single function and don't use it's pointer somewhere (Save it after the function is exit)

并将其优化为:

X(); //First line, just call it
T().Show(val); //Combines third and fourth lines, Allocate on stack and run the single function

如果您问“为什么需要这个?”我正在使用自己的 GC 和堆创建编程语言。 (还有很多东西)

它转换为 C++,然后我不想在翻译时优化代码。 (会很痛的) 因为我可以在一些地方随机调用函数。 (我无法检测它们的值是否被使用)

【问题讨论】:

  • 您正在设计的语言是 1) 静态编译语言 2) 即时语言,还是 3) 解释语言?
  • “.lib 中编译器不知道的函数”如果编译器不知道函数没有任何副作用,则无法对其进行优化(或者更确切地说,这样做是错误的)。我想提一下,C++ 并不是一个非常好的编译目标。
  • @NickODell 解释。 (Somhow C# to C++)
  • @YanaiBugu 如果您可以生成代码来告诉编译器丢弃下一行,您可以自己丢弃下一行。
  • 所以它实际上是一种编译语言。这更有意义。

标签: c++ optimization compiler-construction


【解决方案1】:

优化是特定于编译器的,因此您需要查看编译器的文档以了解它允许您将哪些优化“提示”放入代码中。例如,这里有一些 GCC 的function attributes

  • malloc 属性告诉编译器,如果函数返回一个非空指针,它始终是一个“新”内存区域,而不是另一个指向已分配对象的指针。您可能希望在包装真正的malloc() 的函数上使用它。
  • const 属性(不同于普通的const 关键字)表示函数的返回值仅取决于其参数并且没有副作用,因此编译器可以安全地消除具有相同参数的重复调用。
  • noreturn 属性告诉编译器函数永远不会返回;你可以在终止程序的函数上使用它,比如 C 的exit()

属性继续在函数的声明中,通常在头文件中,因此即使函数的实现在稍后链接的已编译库中,您也可以使用它们。但请记住,函数属性是您对编译器的承诺:例如,如果您使用 noreturn 属性声明一个函数,然后用实际上可以返回的代码实现它,那么运行时可能会发生奇怪的事情。


您还可以使用函数属性来帮助进行正确性检查:

  • nonnull 属性告诉编译器某些(指针)参数不应为空,因此如果检测到它们可能为空,它会发出警告。
  • format 参数告诉编译器该函数采用类似于 C 的 printf() 的格式字符串,因此它可以检查可变参数的类型是否与格式字符串中的相应格式代码匹配。 (例如,您不应该在格式字符串中写入“%s”,然后传递一个整数作为其值。)

【讨论】:

  • 我用的是VC++,VC++里有类似的东西吗? (Windows =)
  • 可能,但我不知道,因为我不使用 VC++。检查文档。
猜你喜欢
  • 2011-10-27
  • 2016-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-22
  • 1970-01-01
相关资源
最近更新 更多