如何向编译器说出如何优化某些内容或某些调用函数。
我的意思是创建分配方法,让编译器优化它,因为它使用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)
并将其优化为:
X(); //First line, just call it
T().Show(val); //Combines third and fourth lines, Allocate on stack and run the single function
如果你问'你为什么需要这个?'我用自己的GC和堆创建编程语言。 (还有很多事情)
它转换为C ++然后我不想在翻译时优化代码。 (这会很痛苦) 因为我可以在地方随机调用函数。 (我无法检测他们的值是否被使用)
答案 0 :(得分:5)
优化是特定于编译器的,因此您需要查看编译器的文档,以查看它允许您放入代码的优化“提示”。例如,以下是GCC的一些function attributes:
malloc
属性告诉编译器,如果函数返回非空指针,它始终是内存的“新”区域,而不是指向已经分配的内容的另一个指针。您可能希望在包含真实malloc()
。const
属性(与普通const
关键字不同)表示函数的返回值仅取决于其参数且没有副作用,因此编译器可以安全地消除重复调用相同的论点。noreturn
属性告诉编译器函数永远不会返回;你可以在终止程序的函数上使用它,比如C exit()
。属性继承函数的声明,通常在头文件中,因此即使函数的实现位于稍后将链接的编译库中,您也可以使用它们。但请记住,函数属性是从您到编译器的承诺:例如,如果您使用noreturn
属性声明一个函数,然后使用实际可以返回的代码实现它,那么在运行时可能会发生奇怪的事情
您还可以使用函数属性来帮助进行正确性检查:
nonnull
属性告诉编译器某些(指针)参数不应该为空,因此如果它检测到它们可能会发出警告。format
参数告诉编译器该函数采用类似C printf()
的格式字符串,因此它可以检查可变参数的类型是否与格式字符串中的相应格式代码匹配。 (例如,您不应在格式字符串中写入“%s
”,而应将整数作为其值传递。)