如何定义x87浮点控制字的初始值?

vll*_*vll 8 c c++ floating-point x87

可以检查x87浮点控制字的值_control87.当一个新线程启动时,在我的平台上,它似乎从父线程继承浮点控制字的值.

这是未定义的行为,还是我保证,如果我启动一个新线程,并且线程库没有错误,控制字具有与父线程中相同的值?

在哪个标准中定义了这种行为,以及如何?如果未在任何标准中定义,是在处理器手册或操作系统文档中定义的?

我正在使用C++语言,在64位Windows 7上开发,编译32位Windows目标,并使用x86兼容处理器执行代码.我需要专门针对此平台的答案,但如果所有语言和处理器的行为相同,那么通用答案会更好.

Die*_*ühl 10

C标准(ISO/IEC 9899:2011)在7.6第2段中有此声明:

浮点环境具有线程存储持续时间.线程浮点环境的初始状态是在创建时创建它的线程的浮点环境的当前状态.

C++标准(ISO/IEC 14882:2014)在26.3.1 [cfenv.syn]第3段中有此声明:

浮点环境具有线程存储持续时间(3.7.2).线程浮点环境的初始状态是线程的浮点环境的状态,该线程在构造对象时构造相应的std :: thread对象(30.3.1).

也就是说,C和C++都指定浮点环境是从创建线程继承的.此浮点环境是任何控件世界的语言级别表示.但请注意,不支持支持浮点环境.例如,C的脚注12(在5.1.2.3;突出显示是我的)中暗示:

用于二进制浮点运算的IEC 60559标准需要某些用户可访问的状态标志和控制模式.浮点运算隐式设置状态标志; 模式影响浮点运算的结果值.支持这种浮点状态的实现需要将其更改视为副作用 - 有关详细信息,请参见附录F.