3

我想将 a 封装float在两个结构中,例如:

struct AngleDeg {
    explicit AngleDeg(float angle):value(angle) {}
    float value;
};

struct AngleRad {
    explicit AngleRad(float angle):value(angle) {}
    float value;
};

然后在一个类中使用这些结构重载一个函数,例如:

...
void DoStuff(AngleRad angle);
inline void DoStuff(AngleDeg angle) { DoStuff(Deg2Rad(angle.value)); }
...

这会像使用以下两个函数一样有效吗?

void DoStuffRad(float angle);
inline void DoStuffDeg(float angle) { DoStuffRad(Deg2Rad(angle)); }
4

5 回答 5

5

它可能不会影响程序的运行速度,但会增加使程序正确的几率。这很有效!

于 2012-07-29T09:21:13.770 回答
1

This question was investigated in a Technical Report on C++ Performance. See appendix D.3 for the Stepanove Abstraction Penalty Benchmark. To quote

The structure of the benchmark is really quite simple. It adds 2000 doubles in an array 25000 times. It does it in 13 different ways that introduce more and more abstract ways of doing it:
0 - uses simple Fortran-like for loop.
1 - 12 use STL style accumulate template function with plus function object.
1, 3, 5, 7 ,9, 11 use doubles. 2, 4, 6, 8, 10, 12 use Double - double wrapped in a class.
1, 2 - use regular pointers.
3, 4 - use pointers wrapped in a class.
5, 6 - use pointers wrapped in a reverse-iterator adaptor.
7, 8 - use wrapped pointers wrapped in a reverse-iterator adaptor.
9, 10 - use pointers wrapped in a reverse-iterator adaptor wrapped in a reverse-iterator adaptor.
11, 12 - use wrapped pointers wrapped in a reverse-iterator adaptor wrapped in a reverse-iterator adaptor.

Output on Ideone: the abstraction penalty (geometric mean of all 13 tests) for a modern compiler (gcc 4.5.1) is less than 1%.

于 2012-08-08T10:43:45.960 回答
1

我认为空间和访问与@jalf 相同,但不确定。所以我听了@quamrana 和@jalf,做了一个运行时测试。

在调试模式下,使用结构的方法要慢约 30%,但在发布模式下它们是等效的。它可能取决于编译器,但我将使用结构的方法。

于 2012-07-29T10:09:01.233 回答
1

不可能肯定地说。如果您想 100% 确定,请检查生成的程序集(或只是时间执行代码)。

但是,有两个观察结果可能对您有所帮助:

  • 首先,您struct的大小与 a 相同float,因此不会浪费空间。并且没有不必要的间接:float可以像以前一样有效地访问包含的内容。所以没有根本原因为什么它应该变慢
  • 但是,这可能会导致某些编译器优化失效。在某些情况下,它可能只是为structs 生成与内置类型不同的代码。或者,它可能floats对“大小为 a 的对象”使用不同的调用约定float

所以也许,也许不是。但速度差异不太可能产生可衡量的差异。

于 2012-07-29T09:52:56.397 回答
0

对于任何值得您花钱的编译器(即使它是免费的),它不会比使用普通浮点数产生任何开销。

于 2012-07-29T10:07:23.840 回答