我正在构建一个类似于这样的C++接口,用于连接C库:
extern "C" {
typedef struct CFooStruct *CFoo;
int CFoo_getLength(CFoo);
// other functions
}
目前我有
class MyFoo {
CFoo foo;
int len;
public:
MyFoo(CFoo foo) : foo(foo), len(CFoo_getLength(foo)) { }
int length() const { return len; } // inline function
// other functions
};
构造函数中检索并缓存长度,因此可以在紧密循环中反复调用
MyFoo::length()
,而不会有性能损失。当直接使用 C 接口时,如果需要,需要手动检索长度一次,然后重复使用。 如果不需要
CFoo
的长度,则永远不会调用 CFoo_getLength()
。C++ 接口旨在更简单易用,并让用户只需使用
length()
,而无需考虑性能。 上述实现的缺点是它在创建每个 MyFoo
对象时都始终调用 CFoo_getLength()
,而不管它是否实际上将在程序中使用。即使
MyFoo
的所有成员函数都是内联的,我认为编译器也无法优化掉对 CFoo_getLength()
的调用,因为它不知道这个函数没有副作用。问题:有没有办法实现仅在程序实际使用长度时才调用
CFoo_getLength()
?(并且它不会为 MyFoo
对象调用多次)有没有办法允许编译器优化掉 CFoo_getLength()
调用(如果它聪明到足以推断出它不需要)?一种方法是在类中设置一个布尔标志,指示长度是否已经被检索:
class MyFoo2 {
CFoo foo;
bool lenKnown = false;
int len;
public:
MyFoo2(CFoo foo) : foo(foo) { }
int length() {
if (!lenKnown) {
len = CFoo_getLength(foo);
lenKnown = true;
}
return len;
}
};
但这是一种运行时解决方案,它使MyFoo
变得更大,并在MyFoo::length()
内导致额外的计算。我想知道是否有一种编译时解决方案。
.cpp
文件到.o
时是危险的?) - Ry-