博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[百度空间] [原] Empty base class optimization
阅读量:5066 次
发布时间:2019-06-12

本文共 1288 字,大约阅读时间需要 4 分钟。

最近遇到了一个诡异的问题, 数组的数据不对, 最后发现是两个类型的大小不一样导致的.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class 
alloc
{
public
:
void
* operator 
new
(
size_t 
n){...}
void 
operator 
delete
(
void
* p) {...}
};
  
class 
alloc2
{
public
:
void
* operator 
new
(
size_t 
n){...}
void 
operator 
delete
(
void
* p) {...}
};
  
class 
DualQuaterion : 
public 
class 
alloc
{...};
  
//override base with different allocation strategy
class 
BoneDQ : 
public 
dualquaterion, 
public 
class 
alloc2
{
public
:
using 
alloc2::operator 
new
;
using 
alloc2::operator 
delete
;
};

两个地方使用的数组类型不一样, 导致数据错误.也就是sizeof(BoneDQ) != sizeof(DualQuaternion).

这是VS2012下的结果, 换用GCC, 两个类型大小一样.

 这个真的没有想到.

最后查到问题在这里:

上面说的基本限制: 如果同时有连续两个一样的子对象, 那么这两个对象地址不一样(C++标准规定), 导致empty base被阻止.

但跟我遇到的问题仍然不一样.

 

但是下面又提到, 

1
2
Empty base optimization is required for StandardLayoutTypes in order to maintain the requirement that the pointer to a standard-layout object, converted using reinterpret_cast, points to its initial member, which is why one of the requirements for a standard layout type is "has no base classes with non-static data members and has no base classes of the same type as the first non-static data member".
(since C++11)

也就是说, 只有C++11以后才要求empty base optimization是必须的. 所以VS2012的处理也是正确的.

转载于:https://www.cnblogs.com/crazii/p/4512807.html

你可能感兴趣的文章
iOS开发——缩放图片
查看>>
HTTP之URL的快捷方式
查看>>
满世界都是图论
查看>>
配置链路聚合中极小错误——失之毫厘谬以千里
查看>>
代码整洁
查看>>
蓝桥杯-分小组-java
查看>>
Android Toast
查看>>
iOS开发UI篇—Quartz2D使用(绘制基本图形)
查看>>
docker固定IP地址重启不变
查看>>
桌面图标修复||桌面图标不正常
查看>>
JavaScript基础(四)关于对象及JSON
查看>>
JAVA面试常见问题之Redis篇
查看>>
jdk1.8 api 下载
查看>>
getElement的几中属性介绍
查看>>
HTML列表,表格与媒体元素
查看>>
雨林木风 GHOST_XP SP3 快速装机版YN12.08
查看>>
java对象的深浅克隆
查看>>
数据结构3——浅谈zkw线段树
查看>>
Introduction to my galaxy engine 2: Depth of field
查看>>
Python 3.X 练习集100题 05
查看>>