有时,C++编译器会在同一二进制文件中为相同类型的T生成不同的内存布局。也就是说,当对象既作为类的非连续子对象发生,又作为独立的对象或数组子对象发生时,就会发生这种情况:
struct A { int i; };
struct B : virtual A { int i; };
struct C : virtual A { int i; };
struct D : B,C { int i; };
...
D d;
B b;
B* p1= &(B&)d;
B* p2= &b;
根据C++14标准,编译器是否可以在单个二进制文件中为T类型的对象生成任意数量的不同布局?内存布
按照标准,在对象和只包含一个对象的结构的联合中,它们一定会相互匹配吗?下面的代码对所有类型都正确吗?
#include <iostream>
using namespace std;
struct T {
int a;
float b;
// many other types...
};
union T_union {
T t1;
struct T_owner {
T t;
} t2;
};
int main() {
T_union un;
un.t1.a = 10;
cout << un.t2.t.a <<
通过对这个问题的讨论, I提出了一个变化:与其访问私有数据成员,还能通过转换和依赖布局兼容性来调用私有成员函数吗?
一些代码(灵感来自Herb的专栏 )
#include <iostream>
class X
{
public:
X() : private_(1) { /*...*/ }
private:
int Value() { return private_; }
int private_;
};
// Nasty attempt to simulate the object layout
// (cross your fingers and toe
ISO C++ (11)是否允许对私有的非静态类成员变量进行优化?这可能会被检测到:
class X { int x; };
assert (sizeof(X) >= sizeof(int));
但我不知道有什么条款要求上面的断言。
为了澄清:(a) C++标准中是否有条款确保上述断言。
(b)有没有人能想到其他方法来检测x的省略?offsetof?
(c)尽管存在(a)和(b)项,但是否允许进行优化?
我有一种感觉,如果类是函数的本地类,那么优化是可能的,但不是这样的(但我希望有明确的引用)。
我试图理解为什么standard_layout不适用于ref类型?
#include <type_traits>
struct X {
int y;
};
static_assert(std::is_standard_layout_v<X>);
static_assert(std::is_standard_layout_v<X&>); // does not compile
我想知道在C++编译器中是否连续分配了来自多个继承级别的类数据成员。例如,如果我有以下类:
class Base
{
public:
int a;
};
class child_1 : public Base
{
public:
int b;
};
class child_2 : public child_1
{
public:
int c;
}
下面的操作是否会在所有编译器上运行并输出预期的结果?
child_2 my_obj;
my_obj.a = 3; my_obj.b = 2; my_obj.c = 1;
Base* base_ptr = (Base*)
假设我有两个不同的类,它们都以相同的内部方式表示2D坐标数据,如下所示:
class LibA_Vertex{
public:
// ... constructors and various methods, operator overloads
float x, y
};
class LibB_Vertex{
public:
// ... same usage and internal data as LibA, but with different methods
float x, y
};
void foobar(){
Lib
我无法理解C和C2在以下代码中的大小差异的原因:
#include <iostream>
struct A {
int* x;
};
struct B {
A a;
int y;
};
struct C : B {
int z;
};
struct B2 : A {
int y;
};
struct C2 : B2 {
int z;
};
int main()
{
std::cout << sizeof(A) << std::endl; // 8
std::cout <<
MacBook空气运行Ubuntu14.04 64位Linux 3.13.0-24-通用#46-Ubuntu清华4月10日19:11:08 UTC 2014 x86_64 GNU/Linux
( A)如何修复内置Macbook Air键盘中没有的键盘键?
1. home key
2. end key
3. screen lock key
4. pause or break key
5. ins key
6. del key
7. page up (seems to be working by pressing FN + up )
8. page down (seems to
让我们考虑一下这样的带标签的联合:
struct TaggedUnion
{
union
{
int integer;
float real;
std::string text;
...
};
size_t disc;
void* data()
{
return &integer;
}
//other special member functions for memory management of non-pod union members
看看这段代码:
struct A {
short s;
int i;
};
struct B {
short s;
int i;
};
union U {
A a;
B b;
};
int fn() {
U u;
u.a.i = 1;
return u.b.i;
}
是否保证fn()返回1
注意:这是的后续问题。