1

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

或者就像代码中某处调用函数 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++ 然后我不想在翻译时优化代码。(这会很痛苦)因为我可以在一些地方随机调用函数。(我无法检测它们的值是否被使用)

4

1 回答 1

5

优化是特定于编译器的,因此您需要查看编译器的文档以查看它允许您将哪些优化“提示”放入代码中。例如,以下是 GCC 的一些函数属性

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

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


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

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