在这个问题,有人建议意见,我应该不会投的结果malloc,即
int *sieve = malloc(sizeof(int) * length);
Run Code Online (Sandbox Code Playgroud)
而不是:
int *sieve = (int *) malloc(sizeof(int) * length);
Run Code Online (Sandbox Code Playgroud)
为什么会这样呢?
当询问C中常见的未定义行为时,灵魂比我提到的严格别名规则更加开明.
他们在说什么?
int arr[] = { 3, 5, 9, 2, 8, 10, 11 };
int arrSize = *(&arr + 1) - arr;
std::cout << arrSize;
Run Code Online (Sandbox Code Playgroud)
我不知道这是如何工作的。所以任何人都可以帮助我解决这个问题。
是底层位表示一个std::array<T,N> v和T u[N]一样的吗?
换句话说,将N*sizeof(T)字节从一个复制到另一个是否安全?(通过reinterpret_cast或memcpy.)
编辑:
为了澄清,重点是相同的位表示和reinterpret_cast.
例如,假设我将这两个类放在一些简单的可复制类型上T,对于某些类N:
struct VecNew {
std::array<T,N> v;
};
struct VecOld {
T v[N];
};
Run Code Online (Sandbox Code Playgroud)
还有遗留功能
T foo(const VecOld& x);
Run Code Online (Sandbox Code Playgroud)
如果表示相同,则此调用是安全的并且避免复制:
VecNew x;
foo(reinterpret_cast<const VecOld&>(x));
Run Code Online (Sandbox Code Playgroud)