- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在运行时向(假)类添加非静态字段。
它对于解耦很有用,例如systemA.cpp
可以为某个Data
添加一个int
字段,而systemB.cpp
可以添加 B
和 C
到同一个 Data
类。
因为这是一个很长的问题,我将分别讨论我的设计、MCVE、它的缺陷、我的方法和问题。
在我的设计中,内存布局与普通类相同。
这是图表:-
在我的用例中,上面的布局比 int-int-int ... B-B-B ...
更快。
(我剖析了。)
为简单起见,我锁定每个字段 64 个字节。
用户必须在使用之前将每个所需的字段及其类型注册到我的库中:-
Ref<int> refInt=addField<int>(); //e.g. systemA.cpp
Ref<B> refB=addField<B>(); //e.g. systemB.cpp
Ref<C> refC=addField<C>();
我的库将计算用户在每个 Data
实例中需要多少个字段(在本例中为 3 个)。
然后,他们可以分配一些Data
实例,并访问Data
的动态字段。
std::vector<Data> datas=allocate(10);
refInt.get(datas[0])=8;
要删除数据
,用户不必调用任何析构函数(B
或C
's) 手动。
^ 这是目标之一。
这是我的代码(库级,简化):-
#include <iostream>
#include <vector>
//---- library -----
void* utilAddAddress(void* current,int offset){
return reinterpret_cast<char*>(current)+offset;
}
int sizePerInstance=0;//accumulate
struct Data{
void* mem=nullptr;
Data(void* pmem){mem=pmem;}
};
template<class T>struct Ref{
int offset=0;
T& get(Data data){
return *static_cast<T*>(utilAddAddress(data.mem,offset));
}
};
template<class T>Ref<T> addField(){
Ref<T> reff;
reff.offset=sizePerInstance;
sizePerInstance+=64;
return reff;
}
std::vector<Data> allocate(int numInstance){
void* oNew= ::operator new(static_cast<size_t>( numInstance*sizePerInstance));
std::vector<Data> toReturn;
for(int n=0;n<numInstance;n++){
toReturn.push_back(Data(utilAddAddress(oNew,n*sizePerInstance)));
}
return toReturn;
}
这是它的使用方法:-
class B{ };
class C{
std::string danger;
};
int main(){
Ref<int> refInt=addField<int>(); //offset = 0
Ref<B> refB=addField<B>(); //offset = 64
Ref<C> refC=addField<C>(); //offset = 128
std::vector<Data> datas=allocate(10);
refInt.get(datas[0])=8;
//destructor ?????
}
它有效,但我找不到有效销毁大量 Data
实例的方法。
要销毁 Data
实例,我必须调用每个字段的析构函数:int
、B
和 C
.
有可能有些字段(例如 C
)不是 POD 类型,所以我不能跳过这个阶段。
到目前为止,我只找到了 2 个选择。 (我会假设每个实例的每个字段都被构造):-
[0]int [0]B [0]C [1]int [1]B [1]C ...
[0]int [1]int [2]int ... [0]B [1]B ... [0]C [1]C ...
这是一种可能的方式(草案):-
std::vector<std::function<......>> deleters;
template<class T>Ref<T> addField(){
......
deleters.push_back([](......){
static_cast<T*>(......)->~T();
});
......
}
为了适本地调用所有析构函数,我将:-
for(int n=0;n<10;n++){
for(int m=0;m<3;m++){
deleters[m](data[n]);
}
}
我将承受 v-table 成本。 (我剖析)
我将遭受缓存未命中,如下图所示。 (我剖析)
当删除大量连续的Data
时,如何高效调用所有合适的析构函数?
我不期待完整的代码。粗略的描述/片段就足够了。
旁注:
Data
最多有 30 个字段。 数据1
数据2
... 最佳答案
最快的方法是通过利用自定义分配器来实现 O(1)。
所有进入数据的东西都必须使用特定的分配器,std::string
是 typedef
的 std::basic_string<char>
,它也有一个默认分配器。
using CBString = std::basic_string<char, std::char_traits<char>, CBAllocator<char>>;
现在 Data
被销毁,就制作CBAllocator
删除其所有池。
您还可以根据 std::is_trivially_destructible
将字段分成两组.要么制作 2 个不同的数据,要么制作一个全无 std::is_trivially_destructible
相邻以提高缓存局部性。您现在可以忽略 std::is_trivially_destructible
的析构函数.
关于c++ - 在运行时添加字段 : suffer either vtable-cost or cache miss at destructor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47737406/
SQLite、Content provider 和 Shared Preference 之间的所有已知区别。 但我想知道什么时候需要根据情况使用 SQLite 或 Content Provider 或
警告:我正在使用一个我无法完全控制的后端,所以我正在努力解决 Backbone 中的一些注意事项,这些注意事项可能在其他地方更好地解决......不幸的是,我别无选择,只能在这里处理它们! 所以,我的
我一整天都在挣扎。我的预输入搜索表达式与远程 json 数据完美配合。但是当我尝试使用相同的 json 数据作为预取数据时,建议为空。点击第一个标志后,我收到预定义消息“无法找到任何内容...”,结果
我正在制作一个模拟 NHL 选秀彩票的程序,其中屏幕右侧应该有一个 JTextField,并且在左侧绘制弹跳的选秀球。我创建了一个名为 Ball 的类,它实现了 Runnable,并在我的主 Draf
这个问题已经有答案了: How can I calculate a time span in Java and format the output? (18 个回答) 已关闭 9 年前。 这是我的代码
我有一个 ASP.NET Web API 应用程序在我的本地 IIS 实例上运行。 Web 应用程序配置有 CORS。我调用的 Web API 方法类似于: [POST("/API/{foo}/{ba
我将用户输入的时间和日期作为: DatePicker dp = (DatePicker) findViewById(R.id.datePicker); TimePicker tp = (TimePic
放宽“邻居”的标准是否足够,或者是否有其他标准行动可以采取? 最佳答案 如果所有相邻解决方案都是 Tabu,则听起来您的 Tabu 列表的大小太长或您的释放策略太严格。一个好的 Tabu 列表长度是
我正在阅读来自 cppreference 的代码示例: #include #include #include #include template void print_queue(T& q)
我快疯了,我试图理解工具提示的行为,但没有成功。 1. 第一个问题是当我尝试通过插件(按钮 1)在点击事件中使用它时 -> 如果您转到 Fiddle,您会在“内容”内看到该函数' 每次点击都会调用该属
我在功能组件中有以下代码: const [ folder, setFolder ] = useState([]); const folderData = useContext(FolderContex
我在使用预签名网址和 AFNetworking 3.0 从 S3 获取图像时遇到问题。我可以使用 NSMutableURLRequest 和 NSURLSession 获取图像,但是当我使用 AFHT
我正在使用 Oracle ojdbc 12 和 Java 8 处理 Oracle UCP 管理器的问题。当 UCP 池启动失败时,我希望关闭它创建的连接。 当池初始化期间遇到 ORA-02391:超过
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 9 年前。 Improve
引用这个plunker: https://plnkr.co/edit/GWsbdDWVvBYNMqyxzlLY?p=preview 我在 styles.css 文件和 src/app.ts 文件中指定
为什么我的条形这么细?我尝试将宽度设置为 1,它们变得非常厚。我不知道还能尝试什么。默认厚度为 0.8,这是应该的样子吗? import matplotlib.pyplot as plt import
当我编写时,查询按预期执行: SELECT id, day2.count - day1.count AS diff FROM day1 NATURAL JOIN day2; 但我真正想要的是右连接。当
我有以下时间数据: 0 08/01/16 13:07:46,335437 1 18/02/16 08:40:40,565575 2 14/01/16 22:2
一些背景知识 -我的 NodeJS 服务器在端口 3001 上运行,我的 React 应用程序在端口 3000 上运行。我在 React 应用程序 package.json 中设置了一个代理来代理对端
我面临着一个愚蠢的问题。我试图在我的 Angular 应用程序中延迟加载我的图像,我已经尝试过这个2: 但是他们都设置了 src attr 而不是 data-src,我在这里遗漏了什么吗?保留 d
我是一名优秀的程序员,十分优秀!