共同背景优先。在 C++ 中,您可以在类主体内部编写方法定义,如以下有效 C++ 样式的Widget类所示:
class Widget {
unsigned TheSize;
public:
unsigned getSize() const { return TheSize; }
};
Run Code Online (Sandbox Code Playgroud)
我知道这种方式也称为类内定义,它是inline隐式的(无需用关键字告诉编译器)。另一方面,您可以在类之外编写方法,显式限定其名称,例如:
class Widget {
unsigned TheSize;
public:
unsigned getSize() const;
};
unsigned Widget::getSize() const {
return TheSize;
}
Run Code Online (Sandbox Code Playgroud)
现在问题来了。我想使用CLion(JetBrains 为 C/C++ 制作的新 IDE)将一些以类内方式编写的类转换为类外方式。我想知道这个漂亮的 IDE 是否为这种重构提供内置支持。我看不到它有一个名为“将内联方法拉出类”的重构,尽管它确实有相反的内联方法重构工具。
编辑:我正在使用的 CLion 版本:
CLion 2018.3.1
Build #CL-183.4588.63, built on December 4, 2018
Licensed to CLion Evaluator
Expiration date: January …Run Code Online (Sandbox Code Playgroud) 我最近正在研究一些JIT编译器。据我所知,JIT是一种将一些脚本语言代码即时编译为本地代码的技术(在执行之前)。正如我想象的那样,这种编译器的内部结构使我发现,必须在生成的本机代码所在的位置上放置一段动态分配的缓冲区。但是然后我们需要一种方法来从保存数据的缓冲区内开始运行代码。我的意思是,char[]由于安全隐患,操作系统不能阻止您这样做,因此您不能只是将一些代码放入a 然后跳入执行。必须有某种方法将缓冲区标记为可执行文件。考虑以下天真的方法:
#include <stdlib.h>
void *jit_some_native_code(void) {
void *code_segment = malloc(1024);
/*
* bla bla bla...
* Generate code into this code_segment.
*/
return code_segment;
}
int main(void) {
void *code = jit_some_native_code();
/*
* How can I start executing instruction in code?
*/
typedef void (*func_ptr_t)(void);
/*
* This won't work. OS bans you doing so.
*/
((func_ptr_t)code)();
}
Run Code Online (Sandbox Code Playgroud)
在Ubuntu上,该代码将运行,但会以状态代码26退出。鉴于C的类型不安全特性,该代码可以编译,但对于C ++,编译器只会使您停止。这是否意味着JIT必须绕过编译器以及设置可执行标志?
编辑:此外mprotect,如果使用mmap,还可以指定页面映射权限:
PROT_EXEC Pages may be executed.
PROT_READ Pages may be read. …Run Code Online (Sandbox Code Playgroud)