标签: pointer-aliasing

SQL Server中别名的方括号和单引号之间有什么区别?

我看到一些人使用单引号别名列名称,例如:

select orderID 'Order No' from orders
Run Code Online (Sandbox Code Playgroud)

和其他人使用方括号,例如:

select orderID [Order No] from orders
Run Code Online (Sandbox Code Playgroud)

我倾向于使用方括号.有偏好/差异吗?

sql-server quotes alias brackets pointer-aliasing

25
推荐指数
3
解决办法
2万
查看次数

如何投射sockaddr_storage并避免违反严格别名规则

我正在使用Beej的网络指南,并遇到了一个别名问题.他提出了一个函数来返回特定结构的IPv4或IPv6地址:

1  void *get_in_addr( struct sockaddr *sa )
2  {
3      if (sa->sa_family == AF_INET)
4        return &(((struct sockaddr_in*)sa)->sin_addr);
5      else
6        return &(((struct sockaddr_in6*)sa)->sin6_addr);
7  }
Run Code Online (Sandbox Code Playgroud)

这会导致GCC 在第3行为sa吐出严格别名错误.据我所知,这是因为我这样调用这个函数:

struct sockaddr_storage their_addr;
...
inet_ntop(their_addr.ss_family,
          get_in_addr((struct sockaddr *)&their_addr),
          connection_name,
          sizeof connection_name);
Run Code Online (Sandbox Code Playgroud)

我猜测别名与their_addr变量是类型的事实有关,sockaddr_storage而另一个不同类型的指针指向同一个内存.

就是要解决这个症结的最佳方式sockaddr_storage,sockaddr_in以及sockaddr_in6组成工会?看起来这应该是网络中的一个很好的领域,我只是找不到任何有最佳实践的好例子.

此外,如果有人能够准确解释别名问题发生的位置,我会非常感激.

c sockets strict-aliasing pointer-aliasing

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

如果已经设置了别名,我怎样才能检查我的bashrc

如果已经设置了别名,我怎样才能检查我的bashrc.

当我提供一个bashrc文件,它有一个函数名称,说好玩,而我当前的环境也有一个别名也很有趣.

我尝试了unalias的乐趣,但这会给我一个错误,当我的环境没有别名时,找不到有趣的错误.

所以在我的bashrc中,在我的趣味函数中,我想检查是否设置了别名,然后是unalias.

bash pointer-aliasing

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

这段代码是否颠覆了C++类型系统?

我知道const在C++ 中使用一个方法意味着一个对象通过该方法是只读的,但它可能仍然会改变.

但是,此代码显然通过const引用(即通过const方法)更改对象.

这段代码在C++中是否合法?

如果是这样:它是否打破const了类型系统的性质?为什么/为什么不呢?

如果没有:为什么不呢?

注1:我对这个例子进行了一些编辑,所以答案可能是指旧的例子.

编辑2:显然你甚至不需要C++ 11,所以我删除了那个依赖.

#include <iostream>

using namespace std;

struct DoBadThings { int *p; void oops() const { ++*p; } };

struct BreakConst
{
    int n;
    DoBadThings bad;
    BreakConst() { n = 0; bad.p = &n; } 
    void oops() const { bad.oops(); }  // can't change itself... or can it?
};

int main()
{
    const BreakConst bc;
    cout << bc.n << endl;   // 0
    bc.oops();              // O:) …
Run Code Online (Sandbox Code Playgroud)

c++ const const-correctness pointer-aliasing

20
推荐指数
1
解决办法
809
查看次数

嵌套结构和c中的严格别名

请考虑以下代码:

typedef struct {
  int type;
} object_t;

typedef struct {
  object_t object;
  int age;
} person_t;

int age(object_t *object) {
  if (object->type == PERSON) {
    return ((person_t *)object)->age;
  } else {
    return 0;
  }
}
Run Code Online (Sandbox Code Playgroud)

这是合法代码还是违反了C99严格别名规则?请解释为何合法/非法.

c pointer-aliasing

17
推荐指数
1
解决办法
1732
查看次数

数组指针别名 - 未定义的行为?

以下代码是否调用未定义的行为(由于别名冲突或其他原因)?

int foo(int (*a)[10], int (*b)[5])
{
    (*a)[5]++;
    return (*b)[0];
}

int x[10];
foo(&x, (int (*)[5])&x[5]);
Run Code Online (Sandbox Code Playgroud)

需要注意的是使用普通的相应的代码int *,而不是指针到数组类型将是完全合法的,因为ab将指针相同类型并且因此允许别名彼此.

编辑:有趣的结果,如果这实际上是一个别名违规,是它似乎是一个hackish但有效的方式来获得restrictC99之前的语义.如:

void some_func(int *aa, int *bb)
{
    int (*a)[1] = (void *)aa;
    int (*b)[2] = (void *)bb;
    /* Now **a and **b can be assumed by the compiler not to alias */
}
Run Code Online (Sandbox Code Playgroud)

假设您需要访问每个地址的实际数组,您可以使用SIZE_MAX-1和SIZE_MAX-2等作为不同的大小.

c undefined-behavior pointer-aliasing

14
推荐指数
1
解决办法
1408
查看次数

在C++中避免别名的"正确"方法是什么(例如在向自身添加容器元素时)?

std::vector<int> a;
a.push_back(1);
a.push_back(a[0]);
Run Code Online (Sandbox Code Playgroud)

刚刚了解到上面的代码非常危险.

(如果不明白为什么,你并不孤单......对我来说也不是很明显.)

我的问题:

  1. 处理它的"标准"方式是什么?制作一个新变量,然后立即将其分配给某些东西对我来说似乎有点奇怪.有没有更好的方法来处理它?

  2. 你如何训练自己注意这样的混叠问题?你在寻找什么样的模式?我不知道这种情况; 当我restrict在C中学习关键字时,我才学会了别名,现在才明白这个问题究竟是什么.


编辑:

我很乐意接受一个答案,但问题的第(2)部分似乎没有得到回答.我想知道人们使用什么策略来查找他们编写的代码中的别名错误.

到目前为止我提出的一个策略是避免在两个参数中传递相同的值.(在这种情况下,一个参数是隐式的,一个是显式的.)

是否还有其他容易注意到的事项需要注意和注意?

c++ lifetime pointer-aliasing

11
推荐指数
2
解决办法
312
查看次数

是否有类似于C++的restrict关键字,表明_iterators_没有别名

g ++确实__restrict__为指针实现,但我找不到任何关于迭代器的东西.我的总体意图是鼓励编译器对stl循环进行矢量化.

编辑:

即使编译器无法进行向量化,__restrict__关键字也应该能够告诉编译器在循环内不需要不必要的重新加载.

c++ iterator pointer-aliasing

9
推荐指数
1
解决办法
951
查看次数

gcc C/C++假设没有指针别名

最近读过在数值计算中fortran比c/c ++更快的主要原因是因为没有指针别名.

显然,使用restrict__restrict__关键字允许根据具体情况来指示给定存储器元素不存在指针别名.

icc编译器显然有一个选项-fno-alias,允许全局假设不存在别名.在gcc上-fno-strict-aliasing,它仅适用于所有别名情况的子集.

gcc中是否存在选项,或者在使用某些优化标志时是否存在未假设别名的情况?

gcc pointers pointer-aliasing

9
推荐指数
1
解决办法
7686
查看次数

在Ruby中运行得更快:定义别名方法还是使用alias_method?

以后调用的速度更快:

def first_method?() second_method?() end
Run Code Online (Sandbox Code Playgroud)

要么

alias_method :first method, :second_method
Run Code Online (Sandbox Code Playgroud)

如果可能的原因?

(注意:我不问什么更好/更好等等 - >只有原始速度以及为什么它更快有趣这里)

ruby performance pointer-aliasing

8
推荐指数
2
解决办法
416
查看次数