2017-02-23 81 views
-2

我有一些基本的C++代码(下面包含)。我希望能够用自定义指令代替发生的每个乘法(包括math.h中包含的cos函数)。我可以直接调用我的main中的自定义指令,但是'cos'仍然使用旧的乘法指令。用自定义指令代替每一个乘法

我已经考虑做操作符重载,但我无法正确地使这个功能。

#include <iostream> 
#include <string> 
#include <math.h> 

int main() 
{ 
    int a = 2; 
    int b = 5; 
    std::cout << "mult: " << a * b << std::endl; 
    std::cout << "cos: " << cos(b) << std::endl; 
    return 0; 
} 

什么是以我想要的方式实现此自定义指令的最佳方法?

+5

我可以问*你为什么要这样做? (PS:我很确定你想要什么是不可能的,操作符重载不会适用于基类型,所以除非你重构整个代码以使用你可以控制的自定义类型......) – Borgleader

+0

NIOSII不支持浮点硬件乘法。我正在引入硬件,并希望加速我的COS计算。我现在有一个自定义指令,所以我可以''a * b'作为'custom_instruction(a,b)',但是因为cos在math.h库中,所以我无法改变这些乘法运算。 –

+3

你怎么知道有乘法编译器正在使用的'std :: cos'的版本?你有权访问编译器的源代码吗?让它使用'custom_instruction(a,b)'可能会更容易,否则它会使软件增加,而不会实际改变你的程序 – Caleth

回答

0

有一种方法可以在不触及代码的情况下替换某些功能。当然,这取决于你如何构建你的代码。 假设您正在使用Linux,您可以使用LD_PRELOAD注入功能。

这里是如何做到这一点很好解释:

https://rafalcieslak.wordpress.com/2013/04/02/dynamic-linker-tricks-using-ld_preload-to-cheat-inject-features-and-investigate-programs/

如果这并不完全适用于你的情况,你可以抓住一些想法,或者干脆学习这个很酷的功能。

0

std::cos只提供了内置的浮动floatdoublelong double点类型(任何整数类型,也可以提供,但它转换为double内部)的过载。您不能为内置类型重载运算符。这意味着你不能做你正在问的东西。

您可以获得的最好方法是编写自己的数字类,以重载乘法运算符,并使用替代乘法实现为其编写自己的三角函数。