im试图在c ++中归档以下内容: 我希望能够创建局部变量,将它们添加到全局静态向量中,并且仅将指向它们的指针添加到向量中。
在C#中,我能够写(示例):
public static List<Component> CACHE = new List<Component>(); //Somewere in class
//Now in method:
Component a = new Component();
a.Name = "Noël";
CACHE.Add(a); //Adds reference to CACHE a without copy
在c ++中,我看到2种解决方案:
1。使用动态分配:
static std::vector<Component*> CACHE; //Somewere in class
//Now in method:
Component* a = new Component();
a->Name = L"Noël";
CACHE.push_back(a);
问题是我不想使用动态分配,因为它的速度很慢。
2。我的想法:
(以某种方式我必须将新运算符设为私有,或者只是在文档中说过,永远不要在Component上使用new)
//somewere hidden:
std::vector<Component*> GLOBAL_CACHE;
//In method dont use new, instead we use a custom global function
Component* a = CREATE_COMPONENT();
static std::vector<Component*> CACHE; //Example
Component& ExampleRef;//Example
a->Name = L"Noël";
CACHE.push_back(a);
ExampleRef = *a;
现在是CREATE_COMPONENT():
Component* CREATE_COMPONENT()
{
GLOBAL_CACHE.push_back(Component()); //Add empty component
return &GLOBAL_CACHE[GLOBAL_CACHE.size() - 1]; //return pointer to construct added above. I think we now have everything on the stack and we just send around pointers to the stack object
}
我的想法值得吗,甚至行得通?还是我应该只使用动态分配?
答案 0 :(得分:0)
由于垃圾回收,在C ++中无法执行相同操作。但是您可以通过使用shared_ptr<Component>
作为向量的元素类型来类似地完成此操作:
#include <memory>
std::vector<std::shared_ptr<Component>> CACHE;
// ...
auto a = std::make_shared<Component>();
a->Name = "Noël";
CACHE.push_back(a);
该组件将在没有更多引用时自动销毁。
如果您不打算将指针的副本存储在其他位置,但是CACHE
是放置指针的唯一位置,则可以改用unique_ptr
:
#include <memory>
std::vector<std::unique_ptr<Component>> CACHE;
// ...
CACHE.push_back(std::make_unique<Component>());
CACHE.back()->Name = "Noël";
与shared_ptr
不同,unique_ptr
不能被复制,只能被移动,这意味着对其只能有1个引用。 unique_ptr
被销毁时,Component对象将被自动销毁。
这正在使用内存分配,但对于C#来说同样如此。
请注意,与C#不同,在C ++中使用new
和delete
是一个坏主意,因为它们易于发生资源和内存泄漏。如果要在堆上创建对象,请改用shared_ptr
和unique_ptr
。
最后,您应该阅读“ C ++移动语义”。您无需避免将事情放到堆栈上。您可以移动对象而不是复制它们。示例:
#include <memory>
std::vector<Component> CACHE;
// ...
Component a;
a.Name = "Noël";
CACHE.push_back(std::move(a)); // No copy. The 'a' variable can no longer be used.
移动有时是自动的,它们是C ++的重要组成部分。但是您需要对其进行自我教育。