gpt4 book ai didi

c++ - 如果在 C++ 中内联一个调用 self 的函数会发生什么

转载 作者:行者123 更新时间:2023-12-02 01:44:40 25 4
gpt4 key购买 nike

首先我以为编译时间会永远持续下去,或者我遇到了一个奇怪的错误,但这并没有发生。代码运行了一段时间然后崩溃了。

这是我的代码:

#include <iostream>

inline void say_hello()
{
std::cout << "hello\n";
say_hello();
}

int main()
{
say_hello();
}

我认为编译器会将其转换为这样的内容:

#include <iostream>

int main()
{
std::cout << "hello\n";
std::cout << "hello\n";
std::cout << "hello\n";
std::cout << "hello\n";
std::cout << "hello\n";
std::cout << "hello\n";
std::cout << "hello\n";
std::cout << "hello\n";
std::cout << "hello\n";
std::cout << "hello\n";
std::cout << "hello\n";
std::cout << "hello\n";
std::cout << "hello\n";
std::cout << "hello\n";
std::cout << "hello\n";
// and crash because my storage is filled
}

但是,我认为编译器忽略了 inline 关键字。

最佳答案

在现代 C++ 中,inline 说明符只是向编译器建议您可能想要内联该函数。编译器不需要遵守。

对于您的特定编译器,请参阅 Visual Studio Inline Functions (C++) 。您似乎“想要”将 __forceinline 装饰器与 #pragma inline_recursion(on) 结合起来。这将内联到 16 的深度,但这也是可以修改的。我希望大家很清楚为什么这都是一个坏主意。请注意,这是特定于所有编译器的,不适用于 gcc。

__forceinline 可能会因多种原因而失败,但可能适用于您的原因:

  • 该函数是递归的(您拥有的)并且未设置#pragma inline_recursion(on)
  • 程序使用 /Ob0 进行编译(调试版本的默认设置,您可能已设置)

如果您想递归到不同于 16(默认)的级别,您可以使用 inline_depth指定的编译指示。

你的函数最终看起来像这样(未经测试):

#include <iostream>

#pragma inline_depth(9000)
#pragma inline_recursion(on)
__forceinline void say_hello()
{
std::cout << "hello\n";
say_hello();
}

int main()
{
say_hello();
}

关于c++ - 如果在 C++ 中内联一个调用 self 的函数会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71083862/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com