【发布时间】:2020-02-13 23:05:31
【问题描述】:
我正在编写一系列函数,这些函数将嵌入一个几乎实时运行的小型微控制器中,因此每个时钟周期都很重要。功能几乎相同。
我能看到在不复制大量代码的情况下做到这一点的唯一方法是使用非常丑陋且不受欢迎的方法在包含文件中声明代码,然后有意包含多次。
以下作品展示了这个概念:
// func.inc
// The absence of an include guard is intentional, as each time this file gets included
// the output will be different
void FUNC(int x)
{
/* SNIP - lots and lots of code that is duplicated between
variant A and B (and more) of the function
for ( ... 4096 )
{
for( lots more nested loops)
{
*/
// IMPORTANT - I do not want to call functions here as it is
// in a tight loop withconsecutive memory accesses of
// different sizes of strided sparse arrays
#ifdef A
printf("A %d\n", x);
#endif
#ifdef B
printf("B %d\n", x);
#endif
/*
}
}
*/
// main.c
#include <stdio.h>
#define FUNC func_A
#define A
#include "func.inc"
#undef A
#undef FUNC
#define FUNC func_B
#define B
#include "func.inc"
#undef B
#undef FUNC
#define FUNC func_AB
#define A
#define B
#include "func.inc"
int main()
{
func_A(10);
func_B(20);
func_AB(30);
printf("Done\n");
return 0;
}
我的问题是,虽然这可行,但它看起来很可怕,并且可能会让其他试图理解它的人感到非常困惑。在这种情况下,使用指向函数的指针效率太低,无法成为可行的选择。
是否有任何人都可以建议的解决方案,而无需简单地复制同一函数的几个略有不同的版本?
【问题讨论】:
-
您使用的编译器是否缺少优化器?优化器将在生成代码时为您内联函数和折叠常量表达式。您不需要跳过所有这些障碍。在最低,从可读且有意义的代码开始,然后检查编译器以最大优化输出的内容。只有当编译器没有生成你认为应该的东西时,才返回并开始摆弄它。
-
你应该
#undef FUNC这样你就不会收到关于非良性重新定义的警告。对此进行了编辑,这似乎是一种奇怪的表达方式,但仍然如此。 -
@birdwes,你能澄清一下你想要 C 代码还是 C++ 代码?它们不是同一种语言,您需要相应地标记问题。
-
这没什么意义。 C++ 是一种真正的语言;它不是 C 语言的一组特定于供应商的扩展,因此您不会遇到“可移植性”问题或“意外构造”。 (在 C++ 中有 对构造函数的隐式调用,但您知道它们正在发生,因为您编写了构造函数!)通常,您可以从 C++ 编译器获得 更好 代码与 C 编译器相比,因为您可以利用现代优化器完全可以忽略的代码中的模板元编程和其他免费抽象等功能。
-
除此之外,要使用哪种语言由您自己决定,但对于 Stack Overflow 问题,您确实需要选择一种。如果您想从询问 C 开始,您可以这样做,然后如果您对 C 的答案不满意,请继续提出关于 C++ 的第二个问题。但是作为一个为嵌入式系统编写信号处理代码作为他们日常工作的人,我真的不认为你的“C-first”方法有任何意义,而且似乎来自一些基本的误解,或者至少没有理解当前技术状态。
标签: c embedded code-duplication