指导编译器如何优化我的代码

Use*_*ted 1 c++ compiler-construction optimization

我怎么能告诉编译器如何优化某些东西或某些调用函数.我的意思是像创建分配方法,让编译器优化它,因为它用malloc或优化它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)
Run Code Online (Sandbox Code Playgroud)

并优化它:

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

如果你问'你为什么需要这个?' 我用自己的GC和堆创建编程语言.(还有很多东西)

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

Wyz*_*a-- 5

优化是特定于编译器的,因此您需要查看编译器的文档,以查看它允许您放入代码的优化"提示".例如,以下是GCC的一些功能属性:

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

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


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

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