- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
当我在 C++ 中执行 sizeof 时,我一定会得到“整个对象”吗?我问是因为我将要使用 memcpy 将对象复制到内存的其他区域(从一开始可能是一个愚蠢的想法,对吧?)。
我担心的是我可能得不到整个对象,而只能得到属于它现在被转换到的类的部分。这有任何意义还是我感到困惑?
编辑例子
class A{ public: int a = 123; };
class B: public A{ public: int b = 321; };
class C : public B{ public: int c = 333; };
C c_ = C();
B b_ = C();
A a_ = C();
std::cout << sizeof(a_) << " , " << sizeof(b_) << " , " << sizeof(c_) << std::endl;
似乎给我 4,8,12。
我想我需要进行动态转换以弄清楚如何获得我在每种情况下构造为“C”类的“完整”对象?
最佳答案
sizeof
将始终返回对象的静态 大小。请注意,在您的示例中,它将与真实对象大小一致,因为没有多态性;当你做的时候
A a = B();
a
是 A
类型 - 你刚好用新的 A
对象初始化了一个新的 B
对象,这导致切片(a
使用 B()
的字段初始化,这与 A
相同).
一个更好的例子是:
B b;
A *a = &b;
在这种情况下,*a
确实是动态类型 B
,但是 sizeof(*a)
仍然会返回 sizeof(A)
,而不是 sizeof(B)
。
有几种方法可以获取对象的动态大小:
return sizeof(*this);
的虚方法,并在所有派生类中重新定义它。 也就是说,这最后一个方法不会特别有用,因为对非平凡类型(例如多态类)执行 memcpy
是未定义的行为(因此即使是第一个方法也是如此,因为我想您会希望对多态类型执行此操作)。
复制多态类问题的常见方法是接受它们必须存在于堆中的事实,并定义执行 virtual A * clone 的
(其中 clone()
方法() {return new B(*this);}B
是派生类)在每个派生类中,并调用 clone()
每当你需要一份拷贝。
请注意,您可以使用一些更微妙的技巧;一旦我有一个类层次结构,它有一个虚拟方法分派(dispatch)到每个派生类的放置 new
和一个用于析构函数,但你真的必须知道你在做什么(在我的例子中我正在调用它们通过 union
包含每个派生类的实例,因此大小和对齐不是问题)。
关于c++ - C++ 中 sizeof 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48982572/
这个问题已经有答案了: Why isn't sizeof for a struct equal to the sum of sizeof of each member? (13 个回答) 已关闭 8
先生。 Stroustrup 在他的新书(TCPL 第 4 版)第 149 页写下了以下内容 1 N && sizeof(long)<=N任何 N 值的实现,更不用说任何人都会考虑使用 wchar_t
如 [5.3.3/3] 所述(expr.sizeof,工作草案): The sizeof operator can be applied to a pointer to a function, but
从C标准来看,int至少有16bit,long至少有32bit,long long如果有的话至少有64bit(有些平台可能不支持)。只是想知道标题中的句子是否总是正确的。 最佳答案 没有。该标准仅定义
我运行的是 Windows 7(64 位)。 这个问题与此处找到的问题相同: long on a 64 bit machine 但更深入,因为它处理更多的数据类型并适用到 C 或 C++,而不是 C#
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 8年前关闭。 Improve this
这个问题在这里已经有了答案: Length of array in function argument (9 个回答) 关闭 9 年前。 #include void printS(char []);
我承认这三个都有不同的含义。但是,我不明白这些具体情况适用于哪些特定情况。任何人都可以分享每个例子吗?谢谢。 malloc(sizeof(int)) malloc(size
To avoid things quietly breaking if you change the array size, I suggest std::copy(a, a + sizeof(a)/
我在 python 中注意到以下事实: >>> (1, 2, 3).__sizeof__() 48 >>> [1, 2, 3].__sizeof__() 64 我理解列表和元组之间的区别,但我希望它们
是否存在与指针大小相同的整数类型?保证所有微架构? 最佳答案 根据 this Wikipedia page ,在 C99 中,您的 stdint.h header 可能声明了 intptr_t 和 u
我注意到 int 和 double 的大小与使用函数 MPI_Type_size(MPI_INT, &MPI_INT_SIZE); 计算的不同。这是否意味着 sizeof(MPI_INT) 返回了错误
这个问题已经有答案了: How to find the size of an array (from a pointer pointing to the first element array)? (
为什么 sizeof 运算符返回的结构大小大于该结构成员的总大小? 最佳答案 这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性: 未对齐的访问
为什么 sizeof 运算符返回的结构大小大于该结构成员的总大小? 最佳答案 这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性: 未对齐的访问
为什么 sizeof 运算符返回的结构大小大于该结构成员的总大小? 最佳答案 这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性: 未对齐的访问
为什么 sizeof 运算符返回的结构大小大于该结构成员的总大小? 最佳答案 这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性: 未对齐的访问
为什么 sizeof 运算符返回的结构大小大于该结构成员的总大小? 最佳答案 这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性: 未对齐的访问
为什么 sizeof 运算符返回的结构大小大于该结构成员的总大小? 最佳答案 这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性: 未对齐的访问
为什么 sizeof 运算符返回的结构大小大于该结构成员的总大小? 最佳答案 这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性: 未对齐的访问
我是一名优秀的程序员,十分优秀!