小编use*_*229的帖子

自定义序列化 - ISerializable 和用于反序列化的受保护/私有构造函数

我不明白它是如何工作的:当我实现 ISerializable 接口时,我必须定义 protected(除非类是密封的,在这种情况下,构造函数应该标记为私有)构造函数:
protected MyClass(SerializationInfo info, StreamingContext context)
此访问修饰符使此构造函数无法用于那么项目如何反序列化成功呢?

c# constructor iserializable deserialization

5
推荐指数
0
解决办法
804
查看次数

std :: shared_ptr内部,弱项超过预期

在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的数量)实现?

c++ stl shared-ptr

5
推荐指数
1
解决办法
1033
查看次数

默认初始化boost :: optional

有没有办法默认初始化boost :: optional变量而不提供T的名字?

struct MyStruct
{
    int a;
};

int main(){
    boost::optional<MyStruct> opt;
    opt = MyStruct(); // <--
}
Run Code Online (Sandbox Code Playgroud)

我的目标是在我只想默认初始化opt时省略提供结构名称.

c++ boost optional

4
推荐指数
1
解决办法
2163
查看次数

reinterpret_cast <T>的反直觉效果

我有以下代码:

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)

c++ reinterpret-cast

0
推荐指数
1
解决办法
98
查看次数