作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经看到了很多以下代码(抽象示例):
char* byteBlockPtr;
long* alignedPtr = NULL;
/* ... */
/* aligning pointer by long boundary */
while (!ALIGNED(byteBlockPtr))
{
byteBlockPtr++;
}
alignedPtr = (long*)byteBlockPtr;
/* ... */
/* do stuff with memory */
alignedPtr++; /* go to next block */
/* ... */
最佳答案
如果使用除标准中列出的特定类型以外的任何类型的指针修改了任何类型的对象,则C标准允许钝化的实现执行其所需的任何操作,而不考虑编译器是否有理由期望该对象正在被使用。改性。指针是否正确对齐都没有关系。根据基本原理,该规则存在,因此给定的代码如下:
float f;
void hey(int *p)
{
f=1.0f;
*p=6;
f+=1.0f;
}
p
可以保存
f
的地址,因此可以在指针分配之前编写
f
并在之后进行读取。在这种情况下,编译器将没有理由期望对
p
的写入会影响
f
,因此没有理由期望冗余存储和装载将有任何用途。
-fno-strict-aliasing
标志。使用该标志时要获得良好的性能,将需要学习使用
restrict
限定符,但是与使用慢速非分块循环相比,使用分块来加快热循环并使用
restrict
最小化
-fno-strict-aliasing
对性能的影响似乎是一种更好的方法。还要注意,gcc经常会处理带有或不带有标志的,正确使用分块优化的代码,但是,当gcc的作者在编译时没有标志为“偶然”且对“修复”没有厌恶时,gcc的作者会考虑任何正确的行为。破坏]这样的代码而没有警告。
void flip_quad16s(uint16_t *p, int num_quads)
{
uint64_t *pp = (uint64_t*)p;
union {
uint64_t dw;
uint16_t hw[4];
} u;
for (int i=0; i<num_quads; i++)
{
memcpy(u.hw, pp, 8);
u.dw = ~u.dw;
/* Note that if p actually identifies something which has no declared
type but will be used as uint16_t, we must make sure that memcpy
uses that as a source type */
memcpy(pp++, u.hw, 8);
}
}
void flip_quad16s(uint16_t *p, int num_quads)
{
uint64_t *pp = (uint64_t*)p;
for (int i=0; i<num_quads; i++)
pp[i] = ~pp[i];
}
关于c - 指针对齐和别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38160925/
我是一名优秀的程序员,十分优秀!