相关疑难解决方法(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++允许使用这种方法修改私有成员?

在几分钟前看到这个问题之后,我想知道为什么语言设计者允许它,因为它允许间接修改私人数据.举个例子

 class TestClass {
   private:
    int cc;
   public:
     TestClass(int i) : cc(i) {};
 };

 TestClass cc(5);
 int* pp = (int*)&cc;
 *pp = 70;             // private member has been modified
Run Code Online (Sandbox Code Playgroud)

我测试了上面的代码,实际上私有数据已被修改.有没有解释为什么允许这种情况发生,或者这只是对语言的疏忽?它似乎直接破坏了私人数据成员的使用.

c++ private-members

18
推荐指数
2
解决办法
1498
查看次数

可以通过强制转换为布局兼容类型来访问私有成员吗?

从这个问题的讨论如何在C++中实现私有变量的访问?我提出了一个变体:可以通过强制转换并依赖布局兼容性来调用私有成员函数,而不是访问私有数据成员吗?

一些代码(灵感来自Herb Sutter的列使用和滥用访问权限)

#include <iostream>

class X 
{ 
public:
  X() : private_(1) { /*...*/ }

private: 
  int Value() { return private_; }
  int private_; 
};

// Nasty attempt to simulate the object layout
// (cross your fingers and toes).
//
class BaitAndSwitch
    // hopefully has the same data layout as X
{   // so we can pass him off as one
public:
  int Value() { return private_; }
private:
  int private_;
};

int f( X& x …
Run Code Online (Sandbox Code Playgroud)

c++ casting access-control private-methods c++11

6
推荐指数
1
解决办法
1622
查看次数