我试图了解COM如何指定其对象的布局,以便想要使用COM对象的客户端知道如何做到这一点.
我已经读过实现多个接口的COM对象可以用不同的方式来实现它,包括使用嵌套类或多重继承.
我的理解是两种技术都必须产生相同的内存布局(符合COM规范),以便想要使用COM对象的客户端(例如在C中)知道如何做.
所以我的具体问题是:使用多重继承与嵌套类实现的c ++对象的内存布局是否存在差异.
有人能指出我指定COM对象布局的位置吗?
我知道类之外的常量变量可以直接优化到编译器的函数调用中,但编译器对常量类变量执行相同操作是否合法?
如果有一个类声明如下:
class A {
public:
const int constVar;
//other, modifiable variables
A(int val): constVar(val) {
//code to initialize modifiable variables
}
};
Run Code Online (Sandbox Code Playgroud)
我创建一个A的实例并调用这样的函数:
A obj(-2);
int absoluteVal = std::abs(A.constVar);
Run Code Online (Sandbox Code Playgroud)
是否允许编译器执行此操作并使类sizeof(int)更小?:
A obj();
int absoluteVal = std::abs(-2);
Run Code Online (Sandbox Code Playgroud) 为什么以下代码中的if条件产生true?
struct A
{
int firstMember;
} a1;
if (&a1 == static_cast<void*>(&a1.firstMember)) std::cout << "equal";
Run Code Online (Sandbox Code Playgroud)
在阅读Stroustrup关于空类的FAQ时,我有点困惑,特别是下面的陈述:
if (p1 == p2) cout << "nice: good optimizer";
Run Code Online (Sandbox Code Playgroud) 我有一个关于sizeof使用 CRTP 实现接口的类实例的问题,如下例所示。
#include <iostream>
class Interface
{
public:
virtual int foo() {
std::cout << "Interface\n";
return 0;
};
};
template <class Derived>
class Base : Interface
{
public:
virtual int foo() override {
Interface::foo();
std::cout << "base\n";
return static_cast<Derived*>(this)->bar2;
}
int bar;
};
class Derived : public Base<Derived>
{
public:
virtual int foo() override {
std::cout << "Derived\n";
Base<Derived>::foo();
return bar;
}
int bar2;
};
int main()
{
std::cout << sizeof(Base<Derived>) << '\n';
std::cout << sizeof(Derived) << …Run Code Online (Sandbox Code Playgroud)