Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么是未对齐的临时文件?_C++ - Fatal编程技术网

C++ 什么是未对齐的临时文件?

C++ 什么是未对齐的临时文件?,c++,C++,当谈到常数T时&提到它可能会因为“未对齐的临时变量”而变慢。什么是未对齐的临时文件?在代码中我会在哪里遇到它 答复说: 由于未对齐的时间和间接寻址的成本,执行常量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!