gpt4 book ai didi

c++ - 现代 C++ 中的内联方法和代码可读性

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:22:08 25 4
gpt4 key购买 nike

关闭。这个问题需要更多 focused .它目前不接受答案。












想改进这个问题?更新问题,使其仅关注一个问题 editing this post .

7年前关闭。




Improve this question




好吧,所以有时我的“编码大脑”会跳过一个齿轮;偶尔你会听到齿轮磨擦的声音。 (例如,我每隔一段时间就会写class Foo : Bar {},然后提醒自己这已经不合适了——而且已经很久没有这样做了)。

我目前的 MO 是使用内联方法作为一种在不牺牲速度的情况下提高代码易读性和可维护性的方法,但我最近遇到了一个问题,这让我质疑这种做法。

因此,给定(公认的人为)代码,例如:

double a;
double b = 0.0;
double c = 0.0;
...
// do some stuff here
...
// skip the sanity checks
// Magic Formula. This does what?
a = b + c - (b * c);
...

我会写:
double a;
double b = 0.0;
double c = 0.0;
...
// do some stuff here
...
// skip the sanity checks
// Oh! It's probability!
a = ProbabilisticOr(b, c);
...
inline double ProbabilisticOr(double b, double c)
{
// Skip the Sanity checks
return b + c - (b * c);
}

我现在正在研究的数学相当复杂。如果我想要一个通用的 CS/CE 能够维护它,它必须写得更像第二个。该代码对时间也很敏感。

正如我上面所说,我最近遇到了一个问题。我做了我的数学常数 static const double ...像一个优秀的小程序员;但是当试图内联访问它们时,编译器会为 DLL 炸毁。目标操作系统是 Linux,但我正在 Windows (Visual Studio 2013) 上开发,并希望保持“跨平台安全”。

这个小问题的解决方法 is to take them out-of-line ;但是,这会影响我的表现吗?鉴于所涉及的深奥数学,可读性是一个严重的问题。但它仍然必须表现良好。

更新:

为了澄清,使用更多/不同 - 并且更加人为的 - 代码:
#ifndef BUILD_DLL
# define DLL_MODE __declspec(dllimport)
#else
# define DLL_MODE __declspec(dllexport)
#endif


class DLL_MODE ContrivedProbabilityExample
{
public:
inline ContrivedProbabilityExample(double value);
inline ContrivedProbabilityExample& operator+=(double value);
private:
inline void CheckValue(double value);
private:
static const double ZERO_PROB = 0.0;
static const double GUARANTEED_PROB= 1.0;
double probability;

private:
// Not implemented
ContrivedProbabilityExample();
};

inline ContrivedProbabilityExample::ContrivedProbabilityExample(double value) : probability(value)
{
CheckValue(value);
}

inline ContrivedProbabilityExample& ContrivedProbabilityExample::operator+=(double value)
{
CheckValue(value);
probability = probability + value - (probability * value);
}

inline void ContrivedProbabilityExample::CheckValue(double value)
{
if(value < ZERO_PROB || value > GUARANTEED_PROB)
throw std::range_error("Hey, whattaya think you're doing?");
}

此代码在两个平台上的静态中都可以正常工作;它将作为 Linux 上的共享库工作。在 Windows 下尝试将其用作 DLL 时会出错。唯一的解决方案是移动 CheckValue方法外线。

“老派” inlineCheckValue方法的代码在调用它的地方“按原样”替换;显然“新学校”内联确实......什么都没有? (因为编译器显然会做它想做的事。)

AFIK 在 DLL 下完成这项工作的唯一方法是移动 CheckValue离线......这对于时间敏感的代码“老派”可能是一个问题(每个调用都是/保证函数开销)。这仍然是一个问题吗?有没有“更好”的方法来保持可读性?例如不要假设每个处理我的代码的 CS/CE 都会精通统计?

注意:这是跨平台的,因此“编译器”可能不是一个有意义的短语。

最佳答案

您想使用 constexp , 就像是:

inline constexpr double ProbabilisticOr(double b, double c)
{
// Skip the Sanity checks
return b + c - (b * c);
}

那么你可以自由地做这样的事情:
static const double a = ProbabilisticOr(b, c);

关于c++ - 现代 C++ 中的内联方法和代码可读性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24535482/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com