我有一门课,我知道它总是由一个人拥有std::shared_ptr
.但是,传递shared_ptr
或甚weak_ptr
至不需要所有权或生命周期保证的函数和方法会产生不必要的开销.为了解决这个问题,我经常将原始指针传递给函数.类本身继承自std::enable_shared_from_this
如此,如果函数需要获取指针的所有权,它可以使用类的方法来获取shared_ptr
.
这一切都很美妙.然而,在某些情况下,我真的不想shared_ptr
从原始指针创建一个,我想要的是一个weak_ptr
.
从我std::shared_ptr
对它的通常实现的理解,它有两个原子变量用作参考计数器; 一个shared_ptr
,一个weak_ptr
.
如果我拥有的只是一个指向我的类的原始指针而我想要一个weak_ptr
,我必须首先创建shared_ptr
并转换它.这样做意味着引用计数器会像这样改变:
shared_ptr
,增加shared_ptr
计数器weak_ptr
,增量weak_ptr
计数器shared_ptr
超出范围,减少shared_ptr
计数器这似乎违背了"你不为你不使用的东西买单"的想法.有没有办法让我的班级在weak_ptr
没有先创建的情况下提供shared_ptr
?
我遇到过一种情况,我的类模板部分特化分享了很多代码,将它移到基类中是有意义的.但是,对于具有相同基类的所有特化,没有意义.
以下示例代码在GCC 7.1中编译而没有错误:
struct foo_base_1 { void bar() { std::cout << "base 1" << std::endl; }; };
struct foo_base_2 { void bar() { std::cout << "base 2" << std::endl; }; };
template <typename A, typename B>
struct foo { };
template <typename A>
struct foo<A, int> : foo_base_1 { };
template <typename A>
struct foo<A, double> : foo_base_2 { };
int main()
{
foo<int, int> x;
foo<int, double> y;
x.bar();
y.bar();
}
Run Code Online (Sandbox Code Playgroud)
我意识到,尽管是同一类的专业,但它们实际上是不同的类型.不过,这感觉不对,同样的类可以从不同的基础继承.
我想要的是一些保证,这是可以的.我找不到标准的相关部分,我不愿意相信它只是因为它编译(我以前被咬过).
我目前正在使用OpenGL,创建一个"纹理缓存"来处理加载图像并使用OpenGL缓冲它们.如果无法加载图像文件,则需要回退到我在构造函数中硬编码的默认纹理.
我基本上需要做的是创建一个统一颜色的纹理.这不是太难,它只是一个像素*颜色通道的数组.
我正在使用std :: vector来保存初始数据,然后再上传OpenGL.我遇到的问题是我无法找到有关使用重复模式初始化矢量的最佳方法的任何信息.
我遇到的第一种方法是使用循环.
std::vector<unsigned char> blue_texture;
for (int iii = 0; iii < width * height; iii++)
{
blue_texture.push_back(0);
blue_texture.push_back(0);
blue_texture.push_back(255);
blue_texture.push_back(255);
}
Run Code Online (Sandbox Code Playgroud)
然而,这似乎是低效的,因为向量必须多次调整自身大小.即使我先保留空间并执行循环,它仍然没有效率,因为内容将在循环之前归零,这意味着每个unsigned char的两次写入.
目前我正在使用以下方法:
struct colour {unsigned char r; unsigned char g; unsigned char b; unsigned char a;};
colour blue = {0, 0, 255, 255};
std::vector<colour> texture((width * height), blue);
Run Code Online (Sandbox Code Playgroud)
然后我使用以下方法提取数据:
reinterpret_cast<unsigned char*>(texture.data());
Run Code Online (Sandbox Code Playgroud)
有比这更好的方法吗?我是C/C++的新手,我会说实话,指针会吓到我.
c++ ×3
c++11 ×1
c++14 ×1
inheritance ×1
pointers ×1
shared-ptr ×1
stdvector ×1
templates ×1
vector ×1
weak-ptr ×1