Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的动态加载介绍+;_C++ - Fatal编程技术网

C++ C+中的动态加载介绍+;

C++ C+中的动态加载介绍+;,c++,C++,目前,我正在开发嵌入式应用程序,需要尽可能低的CPU使用。主循环正在向输出写入一些位。循环迭代次数是非常重要的变量,我们称之为N N可以在0到3之间 for (int i=0; i<N; i++) { WriteBits(); } 此方法速度快得多,但当然需要对N值进行硬编码 是否有另一种方法可以让N变量在运行时从文件中加载,并将其插入#if语句 我的应用程序在Linux Raspbian上运行 编辑: 此应用程序用于在LED面板上显示文本。当我使用for-loop方法时,帧速率

目前,我正在开发嵌入式应用程序,需要尽可能低的CPU使用。主循环正在向输出写入一些位。循环迭代次数是非常重要的变量,我们称之为
N

N
可以在0到3之间

for (int i=0; i<N; i++) {
    WriteBits();
}
此方法速度快得多,但当然需要对
N
值进行硬编码

是否有另一种方法可以让
N
变量在运行时从文件中加载,并将其插入
#if
语句

我的应用程序在Linux Raspbian上运行

编辑:


此应用程序用于在LED面板上显示文本。当我使用for-loop方法时,帧速率约为145 Hz。当使用“定义”时,它将达到200 Hz。

使用不间断的简单开关:

switch(N){
    case 3: WriteBits(); //no break
    case 2: WriteBits(); //no break
    case 1: WriteBits(); //no break
    //case 0: WriteBits(); // If you need N+1 call
}

使用不间断的简单开关:

switch(N){
    case 3: WriteBits(); //no break
    case 2: WriteBits(); //no break
    case 1: WriteBits(); //no break
    //case 0: WriteBits(); // If you need N+1 call
}

你可以这样做,只要COUNT是一个文本

#define LOOP(COUNT, X) LOOP_##COUNT(X)
#define LOOP_1(X) X;
#define LOOP_2(X) LOOP_1(X) LOOP_1(X)
#define LOOP_3(X) LOOP_2(X) LOOP_1(X)
#define LOOP_4(X) LOOP_2(X) LOOP_2(X)
#define LOOP_5(X) LOOP_3(X) LOOP_2(X)
#define LOOP_6(X) LOOP_3(X) LOOP_3(X)
#define LOOP_7(X) LOOP_4(X) LOOP_3(X)
#define LOOP_8(X) LOOP_4(X) LOOP_4(X)
#define LOOP_9(X) LOOP_5(X) LOOP_4(X)
#define LOOP_10(X) LOOP_5(X) LOOP_5(X)

你可以这样做,只要COUNT是一个文本

#define LOOP(COUNT, X) LOOP_##COUNT(X)
#define LOOP_1(X) X;
#define LOOP_2(X) LOOP_1(X) LOOP_1(X)
#define LOOP_3(X) LOOP_2(X) LOOP_1(X)
#define LOOP_4(X) LOOP_2(X) LOOP_2(X)
#define LOOP_5(X) LOOP_3(X) LOOP_2(X)
#define LOOP_6(X) LOOP_3(X) LOOP_3(X)
#define LOOP_7(X) LOOP_4(X) LOOP_3(X)
#define LOOP_8(X) LOOP_4(X) LOOP_4(X)
#define LOOP_9(X) LOOP_5(X) LOOP_4(X)
#define LOOP_10(X) LOOP_5(X) LOOP_5(X)

如果您的计时必须如此精确,您就不能依靠C编译器生成最佳代码。您需要自己编写汇编程序

我建议这样的结构:

  jump to (start + (3-N)*<length of code of WriteBits>)
start:
  <code of WriteBits>
  <code of WriteBits>
  <code of WriteBits>
  end
跳转到(开始+(3-N)*)
开始:



结束

如果您的计时必须如此精确,您就不能依靠C编译器生成最佳代码。您需要自己编写汇编程序

我建议这样的结构:

  jump to (start + (3-N)*<length of code of WriteBits>)
start:
  <code of WriteBits>
  <code of WriteBits>
  <code of WriteBits>
  end
跳转到(开始+(3-N)*)
开始:



结束
[首先,我肯定会质疑是否需要在200Hz下刷新文本显示!鉴于
WriteBits
可能需要花费10秒或100秒的周期来实际执行更新,我也很好奇为什么循环条件会有这么大的影响。]


另一种方法是使用四个单独的函数,
writeZeroBits()
writeOneBits()
等,并根据
N
的值通过函数指针调用。假设
N
的更改相对较少,那么这就避免了条件更改,但仍然是完全“动态的”(代价是必须维护四个函数而不是一个函数)。

[首先,我肯定会质疑是否需要以200Hz刷新文本显示!我也很好奇,既然
WriteBits
大概需要花费10秒或100秒的周期来实际更新,为什么循环条件会有这么大的影响。]




另一种方法是使用四个单独的函数,
writeZeroBits()
writeOneBits()
,并根据
N
的值通过函数指针调用。假设
N
的更改相对较少,则这可以避免有条件的更改,但仍然是完全“动态的”(以必须维护四个功能而不是一个功能为代价).

预处理器宏是在编译时计算的,因此不可能。不可能。
ifdefs
constepr
是编译时机制,需要在编译时进行计算。从文件读取的值取决于运行时,因此需要运行时机制(如for)。但您可以使用该文件衡量最佳性能,然后再为您硬编码最佳值。根据围绕该文件的结构,您可以有四种方法
WriteNoBits()
WriteNoBits()
WriteNoBits()
WriteThreeBits()
,并通过依赖于
N
的函数指针调用。我唯一能想到的另一个想法(非常极端)是动态代码生成,它非常依赖于平台。您确信与(可能)发生的I/O相比,这里的开销实际上是显著的吗?“此方法快得多”多少是多少?@Oliver Charlesworth你能发表你的评论作为答案吗?你的方法给了我170赫兹,这很好,因为预处理器宏是在编译时计算的,所以这是不可能的。不可能的。
ifdefs
constexpr
是编译时机制,需要在编译时进行计算。从file依赖于运行时,因此您需要运行时机制(如for)。但您可以测量文件的最佳性能,然后为您硬编码最佳值。根据围绕此的结构,您可以有四种方法
WriteNoBits()
WriteNoBits()
writewobits()
WriteThreeBits()
,并通过依赖于
N
的函数指针调用。我能想到的唯一另一个想法(非常极端)是动态代码生成,它非常依赖于平台。与(可能)发生的I/O相比,您确信这里的开销实际上是显著的吗?“这种方法要快得多"多少才是多少?@Oliver Charlesworth你能把你的评论作为答案发表吗?你的方法给了我170赫兹,这很好,任何一个称职的编译器都会知道什么时候为你做这件事。但即使你的编译器称职,这也会严重地使优化器偏离轨道。这样做行为不正确。你会得到一次额外的调用y N.@michalsrb这取决于用户需要哪种行为。因为有两个例子有争议。我将在中编辑这篇文章。你可以随时在这里检查编译器生成的汇编代码。@teivaz你是对的,这两个例子是冲突的。任何称职的编译器都会知道何时为你这样做。但即使你的编译器称职它的盐,这将严重地使优化器偏离轨道。这将不会正确运行。任何N都会得到1个额外调用。@michalsrb这取决于用户需要的行为。因为两个有争议的示例。我将在中编辑此示例。您可以始终在这里检查编译器生成的汇编代码。@teivaz您是对的,编译器两个例子是