关于多核CPU或多处理器系统中使用的高速缓存存储器,我有几个问题.(虽然与编程没有直接关系,但是当一个人为多核处理器/多处理器系统编写软件时会产生很多反响,因此在这里问!)
在多处理器系统或多核处理器(Intel Quad Core,Core two Duo等......)中,每个cpu核心/处理器都有自己的缓存(数据和程序缓存)吗?
一个处理器/核心可以访问彼此的高速缓存,因为如果允许它们访问彼此的高速缓存,那么我认为可能存在较少的高速缓存未命中,如果特定处理器高速缓存没有一些数据但是其他一些处理器的缓存可能有它,从而避免从内存读入第一个处理器的缓存?这个假设是否有效且真实?
允许任何处理器访问其他处理器的高速缓冲存储器会有任何问题吗?
我最近一直在问自己的一个真正的问题是,设计选择带来了x86是一个小端架构而不是大端架构?
x86-64 System V ABI(用于除Windows之外的所有内容)过去常常访问http://x86-64.org/documentation/abi.pdf,但该网站现已脱离互联网.
该文件是否有新的权威主页?
这是我的测试代码:
#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) 我们可以operator++为预增量和后增量重载吗?即正确调用SampleObject++和++SampleObject结果.
class CSample {
public:
int m_iValue; // just to directly fetch inside main()
CSample() : m_iValue(0) {}
CSample(int val) : m_iValue(val) {}
// Overloading ++ for Pre-Increment
int /*CSample& */ operator++() { // can also adopt to return CSample&
++(*this).m_iValue;
return m_iValue; /*(*this); */
}
// Overloading ++ for Post-Increment
/* int operator++() {
CSample temp = *this;
++(*this).m_iValue;
return temp.m_iValue; /* temp; */
} */
};
Run Code Online (Sandbox Code Playgroud)
我们不能仅仅基于返回类型重载函数,并且即使我们将其视为允许的,它也不能解决问题,因为调用解析的模糊性.
由于提供了运算符重载以使内置类型的行为类似于用户定义的类型,为什么我们不能同时为我们自己的类型利用前置和后置增量.
假设我有一个在无限循环中提供某种功能的对象。
将无限循环放在构造函数中是否可以接受?
例子:
class Server {
public:
Server() {
for(;;) {
//...
}
}
};
Run Code Online (Sandbox Code Playgroud)
或者如果构造函数永远不会完成,C++ 中是否存在固有的初始化问题?
(这个想法是运行你刚才说的服务器Server server;,可能在某个线程中......)
当我使用不同的编译器编译此代码并检查十六进制编辑器中的输出时,我希望在某处找到字符串“Nancy”。
#include <stdio.h>
int main()
{
char temp[6] = "Nancy";
printf("%s", temp);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
的输出文件gcc -o main main.c如下所示:
的输出g++ -o main main.c,我无法在任何地方找到“Nancy”。
在 Visual Studio (MSVC 1929) 中编译相同的代码,我在十六进制编辑器中看到完整的字符串:
为什么(1)中的字符串中间会出现一些随机字节?
在查看Dear Imgui的代码时,我发现了以下代码(为了相关性进行了编辑):
struct ImVec2
{
float x, y;
float& operator[] (size_t idx) { return (&x)[idx]; }
};
Run Code Online (Sandbox Code Playgroud)
很明显,这在实践中是有效的,但是从 C++ 标准的角度来看,这段代码合法吗?如果没有,任何主要编译器(G++、MSVC、Clang)是否提供任何显式或隐式保证该代码将按预期工作?
是否有可能通过使用纯位加法,减法除以10的无符号整数,也许繁衍?使用资源非常有限且速度慢的处理器.
我有点失望,np.inf // 2评估为np.nan而不是np.inf,就像正常除法的情况一样。
有什么原因让我想念为什么nan比 更好的选择inf?
c++ ×4
intel ×2
performance ×2
x86 ×2
x86-64 ×2
abi ×1
assembly ×1
bit ×1
c ×1
compilation ×1
constructor ×1
cpu-cache ×1
endianness ×1
gcc ×1
hex-editors ×1
linux ×1
low-level ×1
math ×1
nan ×1
numpy ×1
pointers ×1
python ×1
string ×1
struct ×1