我有一个具有以下构造函数的类:
Color(const float red = 0.0f, const float green = 0.0f, const float blue = 0.0f, const float alpha = 1.0f);
Color(const unsigned char red, const unsigned char green, const unsigned char blue, const unsigned char alpha);
Color(const unsigned long int color);
Run Code Online (Sandbox Code Playgroud)
如果我这样称呼它:
Color c{ 0.0f, 1.0f, 0.0f, 1.0f };
Run Code Online (Sandbox Code Playgroud)
一切都好。但如果我这样称呼它:
Color c{ 78, 180, 84, 255 };
Run Code Online (Sandbox Code Playgroud)
或者
Color c{ 0xffffffff };
Run Code Online (Sandbox Code Playgroud)
我收到
错误 C2668:“Color::Color”:对重载函数的不明确调用
为什么?如何使其正确选择?
我需要启动一个进程并将其作为独立进程运行。我有某种入门应用程序,目的是运行另一个exe并立即退出。实现这一目标的最佳方法是什么?
我CreateProcess多次阅读文档,但仍然有疑问。文档说CloseHandle我完成后需要打电话。但是我的父母的应用程序不应该等待孩子退出。文档的另一部分说,我可以不理会句柄-当父进程终止时,系统将关闭它们。这是否意味着子应用程序在父项之后立即退出?似乎不正确-我关闭了启动器,但子进程仍然运行。
DETACHED_PROCESS似乎我在寻找一个标志。但是文档说明了一些有关控制台的内容。什么控制台?我不在乎控制台。
我需要创建一个具有指定背景颜色的无边框窗口.我知道如何删除非客户区域并得到这样的东西:

这很酷但不是我想要的.如果你仔细看看任何一个航空窗口 - 它周围有一个阴影(实际上这不是阴影,而是一些发光).我找到了一个可以使用此代码添加阴影的地方:
const MARGINS shadow_on = { 1, 1, 1, 1 };
DwmExtendFrameIntoClientArea(hwnd, &shadow_on);
Run Code Online (Sandbox Code Playgroud)
这几乎是做它的工作(认为这对我来说绝对不清楚 - 文档没有提到关于阴影和这个函数的关系).几乎.窗户周围出现了一个薄边框.看起来它是半透明的,它打破了窗口的外观和感觉:

我知道这是可能的 - 视觉工作室甚至以某种方式改变了这个边界的颜色!
更新:正如IInspectable在评论中注意到我可以使用负边距DwmExtendFrameIntoClientArea().我设置了-1值并得到了这个结果:

正如你所看到的 - 它甚至更奇怪.我试图用颜色填充背景,但没有运气.
我有大量的数据需要从不同的线程中读取/写入随机位置.有一个mutex显然会杀死性能.我的想法是让mutexes每个人都负责阵列中的特定范围.这样在写之前我可以mutex根据我要编写的数组中的索引来锁定正确的.理论上它可以减少种族.但我想知道 - 也许有更好的方法?
众所周知,std::vector将其数据保存在堆上,因此向量本身的实例和第一个元素具有不同的地址.另一方面,std::array是一个围绕原始数组的轻量级包装器,它的地址等于第一个元素的地址.
我们假设集合的大小足以容纳一个缓存行int32.在我的机器上有384kB L1缓存,这是98304的数字.
如果我迭代std::vector它,我发现我总是首先访问向量本身的地址和下一个访问元素的地址.可能这些地址不在同一个缓存行中.因此每个元素访问都是缓存未命中.
但是,如果我迭代std::array地址在同一个缓存行中,那么它应该更快.
我使用VS2013进行了全面优化测试,std::array速度提高了约20%.
我的假设是对的吗?
更新:为了不创建第二个类似的主题.在这段代码中我有一个数组和一些局部变量:
void test(array<int, 10>& arr)
{
int m{ 42 };
for (int i{ 0 }; i < arr.size(); ++i)
{
arr[i] = i * m;
}
}
Run Code Online (Sandbox Code Playgroud)
在循环中,我正在访问一个数组和一个堆栈变量,它们在内存中彼此远离.这是否意味着每次迭代我都会访问不同的内存并错过缓存?
我想使用现有视图进行串联。在代码中:
auto rng = view::empty<vector<int>>();
for(int i{0}; i < 5; ++i)
{
vector<int> const & v{foo()}; // returns a reference
rng |= view::concat(v); // doesn't compile - error: no viable overloaded '|='
};
Run Code Online (Sandbox Code Playgroud)
换句话说 - 如何创建多个向量的视图,其数量直到运行时才知道?
我开始学习汇编程序,这对我来说并不合乎逻辑.
为什么我不能在寄存器中使用多个更高的字节?
我理解rax- > eax- > 的历史原因ax,所以让我们关注新的 64位寄存器.例如,我可以使用r8和r8d,但为什么不r8dl和r8dh?同样适用于r8w和r8b.
我最初的想法是,我可以使用8个r8b在同一时间寄存器(就像我可以做的al,并ah在同一时间).但我不能.并且使用r8b使完整的r8寄存器"忙".
这提出了一个问题 - 为什么?如果您不能同时使用其他部件,为什么还只需要使用寄存器的一部分?为什么不保持只r8忘记下部?
我有一个文件列表,并且想为每个文件运行一些程序,但前提是它已更改。所以我将所有文件放入向量中并进行迭代,如下所示:
// build.rs
let files = vec![
"fileA",
"fileB",
];
for file in files{
println!("cargo:rerun-if-changed={}", file);
let output = Command::new("glslangValidator")
.args(&["-V", file, "-o", file])
.output()
.expect("failed to run glslangValidator");
}
Run Code Online (Sandbox Code Playgroud)
这是可行的,但构建过程会针对每个文件运行,即使列表中只更改了一个文件。相反,我只想为构建之间更改的文件glslangValidator调用。
请解释模板专业化选择的规则.我有一个例子:
template<typename T1, typename T2 = int>
struct S : false_type{};
template<typename T>
struct S<T, float> : true_type{};
cout << boolalpha << S<float>::value;
Run Code Online (Sandbox Code Playgroud)
为什么输出false?一般来说,typename T2 = int专业类中的默认模板参数会发生什么?它会引入一些影响吗?
我不知道这是API功能(我几乎可以肯定不是)还是GPU细节,但是为什么例如vkCmdWaitEvents可以在渲染过程的内部和外部vkCmdResetEvent进行记录,而只能在外部进行记录呢?其他命令也一样。
c++ ×6
c++11 ×2
winapi ×2
64-bit ×1
arrays ×1
assembly ×1
borderless ×1
caching ×1
overloading ×1
performance ×1
range-v3 ×1
rust ×1
rust-cargo ×1
templates ×1
vector ×1
vulkan ×1
windows ×1
x86 ×1
x86-64 ×1