相关疑难解决方法(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万
查看次数

何时以及如何允许转换为char指针?

我们可以通过将该对象的点T转换为a 来查看类型T*对象的表示char*.至少在实践中:

int x = 511;
unsigned char* cp = (unsigned char*)&x;
std::cout << std::hex << std::setfill('0');
for (int i = 0; i < sizeof(int); i++) {
  std::cout << std::setw(2) << (int)cp[i] << ' ';
}
Run Code Online (Sandbox Code Playgroud)

这输出511我的系统的表示:ff 01 00 00.

(肯定)这里发生了一些实现定义的行为.哪个演员阵容允许我将一个转换int*为一个unsigned char*转换,哪个转换是否需要转换?我一投演就调用了未定义的行为?我可以投这样的任何T*类型吗?这样做我能依靠什么?

c++ memory casting representation

20
推荐指数
2
解决办法
3928
查看次数

标签 统计

c++ ×2

casting ×1

memory ×1

representation ×1