C++ 什么是未对齐的临时文件?
当谈到常数T时&提到它可能会因为“未对齐的临时变量”而变慢。什么是未对齐的临时文件?在代码中我会在哪里遇到它 答复说: 由于未对齐的时间和间接寻址的成本,执行C++ 什么是未对齐的临时文件?,c++,C++,当谈到常数T时&提到它可能会因为“未对齐的临时变量”而变慢。什么是未对齐的临时文件?在代码中我会在哪里遇到它 答复说: 由于未对齐的时间和间接寻址的成本,执行常量T&可能会更慢 然后是两条评论: 即使不存在由于未对齐而导致的性能损失,仅仅是将引用实现为指针这一事实就需要将该值存储在主内存中,这可能比通过寄存器传递要慢一(一级缓存)到十(页面错误)个数量级 这并不能解释什么是未对齐的临时文件。指针可以指向未对齐的地址,但这并不能解释什么是未对齐的临时地址。下一条评论没有提到: 为什么临时官员会不结
常量T&
可能会更慢
然后是两条评论:
即使不存在由于未对齐而导致的性能损失,仅仅是将引用实现为指针这一事实就需要将该值存储在主内存中,这可能比通过寄存器传递要慢一(一级缓存)到十(页面错误)个数量级
这并不能解释什么是未对齐的临时文件。指针可以指向未对齐的地址,但这并不能解释什么是未对齐的临时地址。下一条评论没有提到:
为什么临时官员会不结盟?除非你迷失在未定义的行为中,C++中的所有对象都是按定义对齐的。
没有理由期望临时机构不一致。关于由于间接寻址而导致引用效率低于值的担忧是正确的,有时您甚至可能会找到对未对齐值的引用,但不太可能找到未对齐的临时引用
注:在发布这个问题之前,对“C++”的Web搜索未对齐临时“只有一个结果,导致404错误页面。< P>严格C++中没有对象可以被错配: 对象类型具有对齐要求([basic.basical]、[basic.component]),这些要求对该类型对象的地址进行了限制
所以暂时或不,对象不能被错配。在低级别代码中使用的是未对齐对象,但是这样的代码涉及非标准C++代码(例如,参见)。您可以尝试将一个未对齐的(不存在的)对象传递给函数:
void f(const int& x);
void g(long x){
f(*reinterpret_cast<const int*>(reinterpret_cast<const unsigned char*>(&x)+1));
}
传递给f
的参数存在于内存中,当后者的值被访问时,该访问可能会产生缓存未命中,并且可能会产生比正确对齐时更多的缓存未命中,因为int对象可能分布在两条缓存线上(请参阅rsp+9
)。因此,如果对象本来可以在寄存器上传递,则通过引用传递参数不是最佳的(也就是说,如果对象是可复制的,并且足够小,在窗口x86_64上为-8字节,在x86_64上为Sys V abi为16字节)。如果对象未对齐,则这是最糟糕的
下面,当f
按值取其参数时,会生成许多更好的代码:
void f(int x);
void g(long x){
f(*reinterpret_cast<const int*>(reinterpret_cast<const unsigned char*>(&x)+1));
}
@VTT不,没有解释。那么…你在问吗?不,我没有。malloc与引用有什么关系?这似乎是一个非常奇怪的说法。没有一个理智的编译器会构造未对齐的对象,正是因为它非常昂贵(甚至被禁止)。我可能想讨论一下,我在参考文章中讨论了未对齐的访问。
void f(int x);
void g(long x){
f(*reinterpret_cast<const int*>(reinterpret_cast<const unsigned char*>(&x)+1));
}
g(long):
sal rdi, 24 //no memory access just a right shift right and left shift
sar rdi, 32
jmp f(int) //tail call a ret from f will jump directly
//to g caller!