小编cgs*_*dfc的帖子

CLion 能否将类内方法定义移至类外?

共同背景优先。在 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)

c++ member-functions clion

5
推荐指数
1
解决办法
2523
查看次数

如何在C中将内存段标记为可执行文件?

我最近正在研究一些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)

c executable jit

1
推荐指数
1
解决办法
146
查看次数

标签 统计

c ×1

c++ ×1

clion ×1

executable ×1

jit ×1

member-functions ×1