我不明白它是如何工作的:当我实现 ISerializable 接口时,我必须定义 protected(除非类是密封的,在这种情况下,构造函数应该标记为私有)构造函数:
protected MyClass(SerializationInfo info, StreamingContext context)
此访问修饰符使此构造函数无法用于那么项目如何反序列化成功呢?
在Advanced STL系列的一集(35:00)中,Stephan T Lavavej显示,_Weaks值为0的计数器确定何时删除_Ref_count结构,等于还活着的数量,weak_ptr如果有活着,则加1 shared_ptrs。他解释说,出于线程安全性的考虑,这是必要的:如果_Weaks仅等于weak_ptrthen 的数量,则当last weak_ptr超出范围时,还必须检查_Usesalive shared_ptr的计数器,以检查是否_Ref_count可以删除。由于缺乏原子性,这是不可接受的。
假设_Uses=存活数shared_ptrs _Weaks=存活数weak_ptrs,假设我们有以下情形:
(_Uses= 0,_Weaks= 1):最后weak_ptr超出范围,递减_Weaks
(_Uses= 0,_Weaks= 0):如果_Uses等于0,则删除_Ref_count结构
在多线程应用程序中会发生什么错误,从而迫使我们使用_Weak=存活weak_ptr数量+(shared_ptr1:0的数量)实现?
有没有办法默认初始化boost :: optional变量而不提供T的名字?
struct MyStruct
{
int a;
};
int main(){
boost::optional<MyStruct> opt;
opt = MyStruct(); // <--
}
Run Code Online (Sandbox Code Playgroud)
我的目标是在我只想默认初始化opt时省略提供结构名称.
我有以下代码:
std::vector<short> vec{ 0, 2, 0, 4 };
int* lpvec = reinterpret_cast<int*>(&vec[0]);
Run Code Online (Sandbox Code Playgroud)
(在VC12下编译:短2个字节,int 4个字节)我认为它会产生:
lpvec[0] = 2,
lpvec[1] = 4
Run Code Online (Sandbox Code Playgroud)
但它让我感到惊讶和输出
lpvec[0] = 2 * 2^16 + 0 = 131072,
lpvec[1] = 4 * 2^16 + 0 = 262144
Run Code Online (Sandbox Code Playgroud)
我说反直觉,因为我认为短裤的矢量以下列模式在内存中排列:
+---------+---------+---------+---------+
| 2 bytes | 2 bytes | 2 bytes | 2 bytes |
+---------+---------+---------+---------+
| 0 | 2 | 0 | 4 |
+---------+---------+---------+---------+
Run Code Online (Sandbox Code Playgroud)
所以,int看起来会一样,但占用的空间是原来的两倍:
+-------------+------------+
| 4 bytes | 4 bytes |
+-------------+------------+
| 0*2^16 + …Run Code Online (Sandbox Code Playgroud)