这是我的测试代码:
#include <chrono>
#include <iostream>
#include <cstdlib>
using namespace std;
using ll = long long;
int main()
{
__int128_t a, b;
ll x, y;
a = rand() + 10000000;
b = rand() % 50000;
auto t0 = chrono::steady_clock::now();
for (int i = 0; i < 100000000; i++)
{
a += b;
a /= b;
b *= a;
b -= a;
a %= b;
}
cout << chrono::duration_cast<chrono::milliseconds>(chrono::steady_clock::now() - t0).count() << ' '
<< (ll)a % 100000 << '\n';
x = …Run Code Online (Sandbox Code Playgroud) 这是我不明白的示例部分:
struct Y
{
int z;
};
int main()
{
alignas(Y) std::byte s[sizeof(Y)];
Y *q = new (&s) Y{2};
const int f = reinterpret_cast<Y *>(&s)->z; // Class member access is undefined behavior:
// reinterpret_cast<Y*>(&s) has value "pointer to s"
// and does not point to a Y object
}
Run Code Online (Sandbox Code Playgroud)
整个示例位于https://en.cppreference.com/w/cpp/utility/launder。
我不明白为什么使用reinterpret_cast<Y *>(&s)->z是未定义的行为。我们已经在所谓的“指向s的指针”处构造了一个Y对象,也将其重新解释为Y*,那为什么还说“它不指向一个Y对象”呢?
测试代码:
struct A
{
uint32_t lo : 16;
uint32_t hi : 16;
};
int main()
{
A a{};
a.lo = 0xFFFF;
auto b = a.lo << 16;
cout << b << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出是:-65536,类型b是int但不是uint32_t。
我发现,uint16_t并且uint8_t在移位运算符之后也会变成有符号整数,并且在 中有一个类似的问题C#,得出的结论是当操作数<32位时结果会变成有符号。
为什么当操作数小于 32 位时,移位操作总是产生有符号整数
但是 的类型a.lo是明确的uint32_t,可以通过 验证decltype(a.lo),那么这怎么解释呢?
假设有一个类A。
我希望我的类从两次派生A,以便管理两个A段并访问它们的受保护方法。
喜欢:
typedef A yetA;
class D: public A, public yetA {};
Run Code Online (Sandbox Code Playgroud)
这是行不通的。有没有办法做到这一点?
如果我直接使用ios::out打开一个文件,那么如果该文件存在,它将覆盖它或修改它。
但如果我用 来检查是否存在名为“XXX”的文件ios::in,如果不存在则用 来创建ios::out,则在此期间文件“XXX”可能被其他程序创建,那么文件“XXX”将被覆盖或被删除。和第一种情况一样修改。
如何fstream在 C++ 中安全地创建文件?