2017-02-23 50 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內部)的過載。您不能爲內置類型重載運算符。這意味着你不能做你正在問的東西。

您可以獲得的最好方法是編寫自己的數字類,以重載乘法運算符,並使用替代乘法實現爲其編寫自己的三角函數。