我有以下代码,我想知道是否有人可以帮我看看。

我有一个多线程应用程序,它们都共享一个对象并对其进行操作。我已经创建了指向某个元素的指针,只是不必每次都在长路径中键入内容,但是我担心它可能只是在修改共享对象的副本,而不是共享对象对象本身。

这是代码:

RPCThread* thr = &(args->s->_shared-_>rpcThread[args->threadIndex]);
...
thr->_in_use = true;
...
sema_post(&(thr->_sem_result));

这是有效的还是只是修改副本?

最佳答案

取决于成员_rpcThread的类型。如果仅仅是RPCThread []或* RPCThread
那我不认为你有问题。如果是类(class)类型,那么您需要
知道其operator []的返回类型。如果相关定义是
返回值而不是引用,您可能有一个副本。

除非,当然,除非RPCThread是使用信封字母习惯用法或实现虚拟代理的类。

如果_rpcThread只是一个数组,那么您在这里不会遇到您所要求的别名问题。

在不进行更多代码读取的情况下检查这是一件好事。您可以更改此:

 RPCThread* thr = &(args->s->_shared->_rpcThread[args->threadIndex]);

对此:
 RPCThread* thr = args->s->_shared->_rpcThread + args->threadIndex;

不会导致编译时错误?

07-24 20:45