我想完全理解函数调用参数是如何交错的。在我看来,它有很多含义。看看下面的例子:函数调用参数中交叉表达式的粒度是多少?
void mad(cow_string a, cow_string b);
cow_string s("moo");
cow_string s1 = s;
cow_string s2 = s;
mad(s1+="haha",s2+="hahaha");
其中cow_string就像萨特一个写入时复制字符串容器上GotW描述这里:http://www.gotw.ca/gotw/045.htm
如果S1的评价+ =“哈哈”和s2 + = “hahaha”被交错为非常精细的粒度并不意味着这是在cow_strings内部引用计数(取决于编译器)上创建竞争条件?
如果我尝试用互斥锁来防止竞争条件,甚至不会导致单线程程序中的自锁(这会让我的头部受伤)。例如S1制作一个内部副本并获取互斥量以减少参考计数上下文开关 S2也会生成一个内部副本并运行到互斥锁和bam自锁。
(只有当第一个为真)如果我的团队的其他成员不是大师或不知道它的COW,是否有安全的方法让对象成为COW?
编辑:
为了清楚我不是很交错的表达的照片是由这个她Sutters例子动摇:
// In some header file:
void f(T1*, T2*);
// In some implementation file:
f(new T1, new T2);
这样做:
allocate memory for the T1
construct the T1
allocate memory for the T2
construct the T2
call f()
或者这个:
allocate memory for the T1
allocate memory for the T2
construct the T1
construct the T2
call f()
读到这里:http://flylib.com/books/en/3.259.1.55/1/
第二个编辑: 我想我是假设一个引用计数器在cow_string改变函数内联,这是一个愚蠢的假设。没有那个愚蠢的假设,我的问题没有什么意义。虽然感谢您的答案!
重新编辑新操作符 - 是的,Sutter是对的。我们有另一种类似于我在答案中写的ABCD模式。可以按任意顺序调用T1或T2的新函数,并且可以按任何顺序调用该空间上的构造函数,但只能在调用该实体的空间后调用。所以C必须遵循A,D必须遵循B,否则编译器可以随心所欲。 – Mordachai
并澄清:新的内存不分配给它分配的内存。新的完成时处于未知状态(垃圾)。只有在调用构造函数之后,该空间才会“意味”任何事物,并保持任何有意义的东西。这里的问题是资源泄漏的一个典型问题,也是使用智能指针的主要动机。 Sutter或Meyers或两者都有一个经验法则,永远不会有一个表达式,其中有多个新的表达式。 – Mordachai