y****n 发帖数: 15 | 1 如下面的一段代码,倒数第2行 OPER 可以是 + 或 -
如果不希望把把 + 和 - 分别写成不同的函数,有什么办法么?
这段代码对性能的要求比较高,所以不想用lambda表达式。
void add(...) {...}
void subtract(...) {...}
...
for (int x = 0; x < n - offset; x++)
{
long pos1 = x * m;
long pos2 = (x + offset) * m;
for (int y = 0; y < m; y++, pos1++, pos2++)
v_out[pos1] = v_in[pos1] OPER v_in[pos2];
}
... |
c*********e 发帖数: 16335 | 2 void myOperation(...,int OPER) {
v_out[pos1] = ( OPER == -1 ? (v_in[pos1] - v_in[pos2] ): (v_in[pos1] + v_
in[pos2] ) );
如下面的一段代码,倒数第2行 OPER 可以是 + 或 -
如果不希望把把 + 和 - 分别写成不同的函数,有什么办法么?
这段代码对性能的要求比较高,所以不想用lambda表达式。
void add(...) {...}
void subtract(...) {...}
...
for (int x = 0; x < n - offset; x++)
{
long pos1 = x * m;
long pos2 = (x + offset) * m;
for (int y = 0; y < m; y++, pos1++, pos2++)
v_out[pos1] = v_in[pos1] OPER v_in[pos2];
}
...
【在 y****n 的大作中提到】 : 如下面的一段代码,倒数第2行 OPER 可以是 + 或 - : 如果不希望把把 + 和 - 分别写成不同的函数,有什么办法么? : 这段代码对性能的要求比较高,所以不想用lambda表达式。 : void add(...) {...} : void subtract(...) {...} : ... : for (int x = 0; x < n - offset; x++) : { : long pos1 = x * m; : long pos2 = (x + offset) * m;
|
t****t 发帖数: 6806 | 3 you can use macro (define OPER as + or -), or use lambda. lambda expression
has nothing to do with performance. in fact, lambda expression is used as
anonymous functor, which keeps performance.
【在 y****n 的大作中提到】 : 如下面的一段代码,倒数第2行 OPER 可以是 + 或 - : 如果不希望把把 + 和 - 分别写成不同的函数,有什么办法么? : 这段代码对性能的要求比较高,所以不想用lambda表达式。 : void add(...) {...} : void subtract(...) {...} : ... : for (int x = 0; x < n - offset; x++) : { : long pos1 = x * m; : long pos2 = (x + offset) * m;
|
y****n 发帖数: 15 | 4 多谢你的指点。
我按下面方式定义macro,用visual studio 2008编译。
但在实际执行add()时,执行的却是减法操作。
如果在add()和subtract()的最后加上"#undef OPER",则会出现编译错误,提示在foo
中找不到OPER的定义。
void add(...)
{
#define OPER +
foo(...)
}
void subtract(...)
{
#define OPER -
foo(...)
}
void foo(...)
{
...
v_out[pos1] = v_in[pos1] OPER v_in[pos2];
...
}
expression
【在 t****t 的大作中提到】 : you can use macro (define OPER as + or -), or use lambda. lambda expression : has nothing to do with performance. in fact, lambda expression is used as : anonymous functor, which keeps performance.
|
y****n 发帖数: 15 | 5 这种方式在循环体中,需要多余的比较操作: OPER == -1 ?
这样做的开销有多少?
OPER与-1比较,而不是与0或1比较,速度会更快么?
v_
【在 c*********e 的大作中提到】 : void myOperation(...,int OPER) { : : v_out[pos1] = ( OPER == -1 ? (v_in[pos1] - v_in[pos2] ): (v_in[pos1] + v_ : in[pos2] ) ); : : 如下面的一段代码,倒数第2行 OPER 可以是 + 或 - : 如果不希望把把 + 和 - 分别写成不同的函数,有什么办法么? : 这段代码对性能的要求比较高,所以不想用lambda表达式。 : void add(...) {...} : void subtract(...) {...}
|
l*********s 发帖数: 5409 | 6 write a template function
【在 y****n 的大作中提到】 : 这种方式在循环体中,需要多余的比较操作: OPER == -1 ? : 这样做的开销有多少? : OPER与-1比较,而不是与0或1比较,速度会更快么? : : v_
|
c*****m 发帖数: 1160 | |
t****t 发帖数: 6806 | 8 no, that's not how macro works. to use macro, you need to write:
define FOO \
{ \
/*...*/ \
v_out[pos1] = v_in[pos1] OPER v_in[pos2]; \
}
#define OPER +
void add(...)
FOO
#undef OPER
#define OPER -
void subtract(...)
FOO
#undef OPER
it's not a very pleasant solution, of course. i won't recommend that.
foo
【在 y****n 的大作中提到】 : 多谢你的指点。 : 我按下面方式定义macro,用visual studio 2008编译。 : 但在实际执行add()时,执行的却是减法操作。 : 如果在add()和subtract()的最后加上"#undef OPER",则会出现编译错误,提示在foo : 中找不到OPER的定义。 : void add(...) : { : #define OPER + : foo(...) : }
|
N8 发帖数: 110 | 9 template
no, that's not how macro works. to use macro, you need to write:
define FOO \
{ \
/*...*/ \
v_out[pos1] = v_in[pos1] OPER v_in[pos2]; \
}
#define OPER +
void add(...)
FOO
#undef OPER
#define OPER -
void subtract(...)
FOO
#undef OPER
it's not a very pleasant solution, of course. i won't recommend that.
foo
【在 t****t 的大作中提到】 : no, that's not how macro works. to use macro, you need to write: : define FOO \ : { \ : /*...*/ \ : v_out[pos1] = v_in[pos1] OPER v_in[pos2]; \ : } : #define OPER + : void add(...) : FOO : #undef OPER
|
c*********e 发帖数: 16335 | 10 哪位给一个template的写法?
【在 N8 的大作中提到】 : template : : no, that's not how macro works. to use macro, you need to write: : define FOO \ : { \ : /*...*/ \ : v_out[pos1] = v_in[pos1] OPER v_in[pos2]; \ : } : #define OPER + : void add(...)
|
|
|
k**********g 发帖数: 989 | 11 template
struct add_op {
T operator () (const T& src0, const T& src1) const
{ return src0 + src1; }
};
template
struct sub_op {
T operator () (const T& src0, const T& src1) const
{ return src0 - src1; }
};
template
class vec_apply {
void operator () (T* v_out, T* vec_in, long len, ...)
{
oper op; // creates a oper object (functor) on stack - does not take
space, because it will be optimized away when compiler finds that it is a
functor.
for (long k = 0; k < len; ++k)
{
long pos1 = x * m;
long pos2 = (x + offset) * m;
for (int y = 0; y < m; y++, pos1++, pos2++)
{
// Calls the functor of the object. In release mode (inline
optimizations on), will become same as (v_in[pos1] + v_in[pos2])
v_out[pos1] = op(v_in[pos1], v_in[pos2]);
}
}
}
} |
c*********e 发帖数: 16335 | 12 template
struct add_op {
T operator () (const T& src0, const T& src1) const
{ return src0 + src1; }
};
第三行最后一个const是啥目的?
【在 k**********g 的大作中提到】 : template : struct add_op { : T operator () (const T& src0, const T& src1) const : { return src0 + src1; } : }; : template : struct sub_op { : T operator () (const T& src0, const T& src1) const : { return src0 - src1; } : };
|
G*****7 发帖数: 1759 | 13 write a template function parameterized on function or functors such as std:
:plus and std::minus
【在 y****n 的大作中提到】 : 如下面的一段代码,倒数第2行 OPER 可以是 + 或 - : 如果不希望把把 + 和 - 分别写成不同的函数,有什么办法么? : 这段代码对性能的要求比较高,所以不想用lambda表达式。 : void add(...) {...} : void subtract(...) {...} : ... : for (int x = 0; x < n - offset; x++) : { : long pos1 = x * m; : long pos2 = (x + offset) * m;
|
G*****7 发帖数: 1759 | 14 or, use std transform.
lambda are resolved by compiler and inlined by optimizer. why the
performance concern?
【在 y****n 的大作中提到】 : 如下面的一段代码,倒数第2行 OPER 可以是 + 或 - : 如果不希望把把 + 和 - 分别写成不同的函数,有什么办法么? : 这段代码对性能的要求比较高,所以不想用lambda表达式。 : void add(...) {...} : void subtract(...) {...} : ... : for (int x = 0; x < n - offset; x++) : { : long pos1 = x * m; : long pos2 = (x + offset) * m;
|
a9 发帖数: 21638 | 15 你是想咋重用啊?
是编译期间指定还是执行期间?
【在 y****n 的大作中提到】 : 如下面的一段代码,倒数第2行 OPER 可以是 + 或 - : 如果不希望把把 + 和 - 分别写成不同的函数,有什么办法么? : 这段代码对性能的要求比较高,所以不想用lambda表达式。 : void add(...) {...} : void subtract(...) {...} : ... : for (int x = 0; x < n - offset; x++) : { : long pos1 = x * m; : long pos2 = (x + offset) * m;
|
b***i 发帖数: 3043 | 16 期待lz回答这个问题。
【在 a9 的大作中提到】 : 你是想咋重用啊? : 是编译期间指定还是执行期间?
|
r****t 发帖数: 10904 | 17 都在说代码,应该是编译时。
【在 a9 的大作中提到】 : 你是想咋重用啊? : 是编译期间指定还是执行期间?
|
y****n 发帖数: 15 | 18 希望在编译时,生成2个函数:
add()
subtract()
这两个函数中,除了一个位置的符号以外,其余地方都一样。
所以我的问题是如何只写一遍代码,编译出不同的函数。 |
t****t 发帖数: 6806 | 19 有人不是给了你模板的写法吗, 就用那个就可以了.
【在 y****n 的大作中提到】 : 希望在编译时,生成2个函数: : add() : subtract() : 这两个函数中,除了一个位置的符号以外,其余地方都一样。 : 所以我的问题是如何只写一遍代码,编译出不同的函数。
|
i*********n 发帖数: 58 | 20 Template function with scalar argument.
Compiler will optimize away the flag.
#include
using namespace std;
#define foo_plus foo
#define foo_minus foo
template
int foo(int a, int b) {
return plus ? (a + b) : (a - b);
}
int
main( int args, char *argv[] )
{
cout << foo_plus(5, 2) << endl;
cout << foo_minus(5, 2) << endl;
return 0;
} |