相关疑难解决方法(0)

C++别名规则

只是想知道是否有人会为我确认一些别名规则.

我知道别名(即加载存储问题)可能导致以下类型的代码不是最理想的,因为我们不能假设x, y, z不重叠:

// case 1:
void plus(size_t n, double *x, double *y, double *z)
{
    for (size_t i = 0; i != n; ++i)
        z[i] = x[i] + y[i];
} 
Run Code Online (Sandbox Code Playgroud)

我知道有一个C关键字__restrict提示编译器它不应该考虑重叠的情况,因此可能生成更好的代码:

// case 2:
void plus(size_t n, double *__restrict x, double *__restrict y, double *__restrict z)
{ // as above... }
Run Code Online (Sandbox Code Playgroud)

但是,别名如何使用C++样式代码,我们将处理通过引用传递的容器对象,而不是上面带有原始指针的C类示例?

例如,我假设如果我们执行以下操作会出现别名问题:

// case 3:
void plus(std::vector<double> &x, std::vector<double> &y, std::vector<double> &z)
{ // similar to above... }
Run Code Online (Sandbox Code Playgroud)

并且转移到一个不那么简单的例子,如果容器中的底层数据类型不同,它会有什么不同吗?在实现级别,大多数容器使用指针动态管理存储,因此我不清楚编译器如何确保以下不是别名: …

c++

21
推荐指数
2
解决办法
1万
查看次数

C++中的容器协方差

我知道C++不支持容器元素的协方差,就像在Java或C#中一样.所以下面的代码可能是未定义的行为:

#include <vector>
struct A {};
struct B : A {};
std::vector<B*> test;
std::vector<A*>* foo = reinterpret_cast<std::vector<A*>*>(&test);
Run Code Online (Sandbox Code Playgroud)

毫不奇怪,我在建议这个解决另一个问题时收到了downvotes .

但是C++标准的哪一部分确切地告诉我这将导致未定义的行为?它的保证,无论std::vector<A*>std::vector<B*>他们的指针存储在内存中的continguous块.它也保证了sizeof(A*) == sizeof(B*).最后,A* a = new B完全合法.

那么我标准的标准是什么坏的(风格除外)?

c++ covariance

18
推荐指数
1
解决办法
3856
查看次数

标签 统计

c++ ×2

covariance ×1