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

C++ 指导编译器如何优化我的代码,c++,optimization,compiler-construction,C++,Optimization,Compiler Construction,我如何告诉编译器如何优化某些东西,或者调用什么函数。 我的意思是像创建allocate方法一样,让编译器在使用malloc或new进行优化时对其进行优化 或者,如果在代码的某个地方调用了函数X,但没有使用它的返回值,则删除此调用。函数,编译器对此一无所知 有这样的选择吗 例如: auto val=X(); //Use the return value X(); //Don't use auto t=allocate<T>(); //Allocate on heap t->Sho

我如何告诉编译器如何优化某些东西,或者调用什么函数。 我的意思是像创建allocate方法一样,让编译器在使用malloc或new进行优化时对其进行优化


或者,如果在代码的某个地方调用了函数X,但没有使用它的返回值,则删除此调用。函数,编译器对此一无所知

有这样的选择吗

例如:

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)
如果你问‘为什么需要这个?’,我正在用自己的GC和堆创建编程语言。还有很多事情

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

优化是特定于编译器的,因此您需要查看编译器的文档,查看它允许您在代码中添加哪些优化提示。例如,以下是一些通用条款:

malloc属性告诉编译器,如果函数返回一个非空指针,那么它总是一个新的内存区域,而不是指向已分配内容的另一个指针。您可能希望在包装真正malloc的函数上使用它。 与普通const关键字不同的const属性表示函数的返回值完全取决于其参数,并且没有副作用,因此编译器可以安全地消除具有相同参数的重复调用。 noreturn属性告诉编译器函数永远不会返回;您可以在终止程序的函数上使用它,比如C的exit。 属性是函数声明的基础,通常在头文件中,因此即使函数的实现在稍后链接的编译库中,也可以使用它们。但是请记住,函数属性是您对编译器的承诺:例如,如果您使用noreturn属性声明一个函数,然后使用实际可以返回的代码实现它,那么在运行时可能会发生奇怪的事情

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

nonnull属性告诉编译器某些指针参数不应该为null,因此如果检测到它们可能为null,它可以发出警告。 format参数告诉编译器该函数采用类似于C的printf的格式字符串,因此它可以检查变量参数的类型是否与格式字符串中相应的格式代码匹配。例如,不应将%s写入格式字符串,而应传递一个整数作为其值。
优化是特定于编译器的,所以您需要查看编译器的文档,以了解它允许您在代码中添加哪些优化提示。例如,以下是一些通用条款:

malloc属性告诉编译器,如果函数返回一个非空指针,那么它总是一个新的内存区域,而不是指向已分配内容的另一个指针。您可能希望在包装真正malloc的函数上使用它。 与普通const关键字不同的const属性表示函数的返回值完全取决于其参数,并且没有副作用,因此编译器可以安全地消除具有相同参数的重复调用。 noreturn属性告诉编译器函数永远不会返回;您可以在终止程序的函数上使用它,比如C的exit。 属性是函数声明的基础,通常在头文件中,因此即使函数的实现在稍后链接的编译库中,也可以使用它们。但是请记住,函数属性是您对编译器的承诺:例如,如果您使用noreturn属性声明一个函数,然后使用实际可以返回的代码实现它,那么在运行时可能会发生奇怪的事情

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

nonnull属性告诉编译器某些指针参数不应该为null,因此如果检测到它们可能为null,它可以发出警告。 format参数告诉编译器该函数采用类似于C的printf的格式字符串,因此它可以检查变量参数的类型是否与格式字符串中相应的格式代码匹配。例如,不应将%s写入格式字符串,而应传递一个整数作为其值。
您正在设计的语言1是静态编译语言2是即时语言,还是3是解释语言?函数来自.lib,编译器对此一无所知如果编译器不知道某个函数没有任何副作用,它无法对其进行优化,或者更确切地说,这样做是错误的。我想提到C++不是一个非常好的编译目标。Somhow C to C++@YanaiBugu如果你能生成代码告诉编译器抛出nex
t行,你可以把下一行扔掉。所以它实际上是一种编译语言。这就更有意义了。你设计的语言1是静态编译语言2是即时语言,还是解释语言3?来自.lib的函数编译器对此一无所知如果编译器不知道函数没有任何副作用,它就无法对其进行优化,或者更确切地说,这样做是错误的。我想提到C++不是一个非常好的编译目标。Somhow C to C++@YanaiBugu如果你能生成代码告诉编译器扔掉下一行,你自己也可以扔掉下一行。所以它实际上是一种编译语言。这就更有意义了。我使用的是VC++,有类似VC++的东西吗?Windows=可能,但我不知道,因为我不使用VC++。检查文档。我使用的是VC++,有类似VC++的东西吗?Windows=可能,但我不知道,因为我不使用VC++。检查文档。
X(); //First line, just call it
T().Show(val); //Combines third and fourth lines, Allocate on stack and run the single function