我看到一些人使用单引号别名列名称,例如:
select orderID 'Order No' from orders
Run Code Online (Sandbox Code Playgroud)
和其他人使用方括号,例如:
select orderID [Order No] from orders
Run Code Online (Sandbox Code Playgroud)
我倾向于使用方括号.有偏好/差异吗?
我正在使用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组成工会?看起来这应该是网络中的一个很好的领域,我只是找不到任何有最佳实践的好例子.
此外,如果有人能够准确解释别名问题发生的位置,我会非常感激.
如果已经设置了别名,我怎样才能检查我的bashrc.
当我提供一个bashrc文件,它有一个函数名称,说好玩,而我当前的环境也有一个别名也很有趣.
我尝试了unalias的乐趣,但这会给我一个错误,当我的环境没有别名时,找不到有趣的错误.
所以在我的bashrc中,在我的趣味函数中,我想检查是否设置了别名,然后是unalias.
我知道const在C++ 中使用一个方法意味着一个对象通过该方法是只读的,但它可能仍然会改变.
但是,此代码显然通过const引用(即通过const方法)更改对象.
这段代码在C++中是否合法?
如果是这样:它是否打破const了类型系统的性质?为什么/为什么不呢?
如果没有:为什么不呢?
#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) 请考虑以下代码:
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严格别名规则?请解释为何合法/非法.
以下代码是否调用未定义的行为(由于别名冲突或其他原因)?
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 *,而不是指针到数组类型将是完全合法的,因为a与b将指针相同类型并且因此允许别名彼此.
编辑:有趣的结果,如果这实际上是一个别名违规,是它似乎是一个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等作为不同的大小.
std::vector<int> a;
a.push_back(1);
a.push_back(a[0]);
Run Code Online (Sandbox Code Playgroud)
我刚刚了解到上面的代码非常危险.
(如果不明白为什么,你并不孤单......对我来说也不是很明显.)
处理它的"标准"方式是什么?制作一个新变量,然后立即将其分配给某些东西对我来说似乎有点奇怪.有没有更好的方法来处理它?
你如何训练自己注意这样的混叠问题?你在寻找什么样的模式?我不知道这种情况; 当我restrict在C中学习关键字时,我才学会了别名,现在才明白这个问题究竟是什么.
我很乐意接受一个答案,但问题的第(2)部分似乎没有得到回答.我想知道人们使用什么策略来查找他们编写的代码中的别名错误.
到目前为止我提出的一个策略是避免在两个参数中传递相同的值.(在这种情况下,一个参数是隐式的,一个是显式的.)
是否还有其他容易注意到的事项需要注意和注意?
g ++确实__restrict__为指针实现,但我找不到任何关于迭代器的东西.我的总体意图是鼓励编译器对stl循环进行矢量化.
编辑:
即使编译器无法进行向量化,__restrict__关键字也应该能够告诉编译器在循环内不需要不必要的重新加载.
最近读过在数值计算中fortran比c/c ++更快的主要原因是因为没有指针别名.
显然,使用restrict或__restrict__关键字允许根据具体情况来指示给定存储器元素不存在指针别名.
icc编译器显然有一个选项-fno-alias,允许全局假设不存在别名.在gcc上-fno-strict-aliasing,它仅适用于所有别名情况的子集.
gcc中是否存在选项,或者在使用某些优化标志时是否存在未假设别名的情况?
以后调用的速度更快:
def first_method?() second_method?() end
Run Code Online (Sandbox Code Playgroud)
要么
alias_method :first method, :second_method
Run Code Online (Sandbox Code Playgroud)
如果可能的原因?
(注意:我不问什么更好/更好等等 - >只有原始速度以及为什么它更快有趣这里)