小编Dae*_*pha的帖子

避免等待SwapBuffers

我发现OpenGL中的SwapBuffers会忙着等待,只要显卡没有完成渲染,或者它正在等待V-Sync.

这对我来说是个问题,因为我不想在等待卡完成时浪费100%的CPU核心.我不是在编写游戏,所以我不能将CPU周期用于任何更高效的工作,我只想将它们放到操作系统中的其他进程中.

我发现回调函数如glutTimerFunc和glutIdleFunc可能对我有用,但我不想使用过剩.仍然,过剩必须以某种方式使用正常的gl函数来做到这一点,对吗?

有没有像"glReadyToSwap"或类似的功能?在那种情况下,我可以检查每毫秒左右,并确定我是否应该等待一段时间或进行交换.我也可以想象也许跳过SwapBuffers并编写我自己类似的功能,如果有人能指出我正确的方向,那就不要忙.

c++ opengl winapi

22
推荐指数
1
解决办法
1万
查看次数

将"normal"std :: string转换为utf-8

让我们看看我是否可以在没有太多事实错误的情况下解释这一点......

我正在写一个字符串类,我希望它使用utf-8(存储在std :: string中)作为它的内部存储.我希望它能够兼顾"正常" std::stringstd::wstring输入输出.

使用std :: wstring不是问题,我可以std::codecvt_utf8<wchar_t>用来转换和转换为std :: wstring.

然而,经过广泛的谷歌搜索和搜索SO我还没有找到一种方法来转换"正常/默认"C++ std :: string(我假设在Windows中使用本地系统本地化?)和utf-8标准: :串.

我想一个选择是首先将std :: string转换为std :: wstring std::codecvt<wchar_t, char>,然后将其转换为utf-8,但是这看起来非常低效,因为至少char的前128个值应该翻译如果我理解正确,无论本地化如何,直接转到utf-8而不进行转换.

我发现了类似的问题:C++:如何将ASCII或ANSI转换为UTF8并存储在std :: string中 虽然我对这个答案有点怀疑,因为它很难编码为latin 1而我希望这适用于所有类型的本地化是安全的.

没有答案涉及提升感谢,我不希望让我的代码库使用它的头痛.

c++ windows localization utf-8 visual-studio-2010

13
推荐指数
1
解决办法
3万
查看次数

C风格的C语言转换和可读性

是的我知道你不应该在C++中使用C风格的演员表,但在某些情况下我真的认为它更具可读性,比较这两个例如:

d = ((double)i * 23.54) / (d + (double)j);

d = (static_cast<double>(i) * 23.54) / (d + static_cast<double>(j));
Run Code Online (Sandbox Code Playgroud)

哪一个更具可读性?

现在谈谈我的主要问题.显然我更喜欢上面一个,但有一种方法可以让它在我看来更具可读性:

d = (double(i) * 23.54) / (d + double(j));
Run Code Online (Sandbox Code Playgroud)

我的问题是,效率会降低吗?在这种情况下,编译器是否会创建比使用其他方法更多的双打,或者它是否足够聪明?这或多或少比典型的C风格演员阵容差吗?

c c++ casting readability

10
推荐指数
2
解决办法
715
查看次数

特征将旋转和平移组合成一个矩阵

我有一个旋转矩阵rot(Eigen :: Matrix3d)和一个平移向量transl(Eigen :: Vector3d),我想在4x4变换矩阵中将它们放在一起.我只是因为我的生活无法弄清楚如何在Eigen中做到这一点.我认为Affine可以以某种方式使用,但我不明白它是如何工作的.

基本上我想要一个如何在Eigen中转换矩阵(4x4)的组合变换相乘和特征矩阵类型

我的代码(由于我不理解Affine如何工作而无法编译)如下所示:

Eigen::Affine3d r(rot);
Eigen::Affine3d t(transl);
Eigen::Matrix4d m = t.matrix();
m *= r.matrix();
Run Code Online (Sandbox Code Playgroud)

c++ matrix eigen

9
推荐指数
3
解决办法
3万
查看次数

C/C++故意超出范围索引

说我有一个像这样的数组:

int val[10];
Run Code Online (Sandbox Code Playgroud)

我故意用从负值到任何高于9的值来索引它,但没有以任何方式使用结果值.这可能是出于性能原因(也许在进行数组访问后检查输入索引会更有效).

我的问题是:

  1. 这样做是否安全,或者我是否会遇到某种内存保护障碍,有可能破坏某些指数的内存或类似情况?
  2. 如果我像这样访问超出范围的数据,它可能没有效率吗?(假设数组没有内置范围检查).
  3. 这会被认为是不好的做法吗?(假设写了一条注释,表示我们知道使用超出范围的索引).

c c++ arrays

6
推荐指数
3
解决办法
466
查看次数

在保持容量时重置字符串

我在这里读了很多关于如何完全清除字符串的问题(即重置容量,释放内存).我的问题恰恰相反; 是否有任何可靠的方法来重置字符串(长度),同时保证其容量保持不变?

示例:在循环中重用临时字符串.

如果我这样做,可能会默认发生这种情况

str.clear()
str.reserve(256)
Run Code Online (Sandbox Code Playgroud)

在每个循环迭代中,至少在根据这篇文章的答案使用Visual Studio时:std :: string在visual studio上的特定行为?

但依赖"可能"似乎有点风险.

c++ string

6
推荐指数
1
解决办法
230
查看次数

将处理RegistryKey也关闭它吗?

正如标题所说.

另外,反过来; 会关闭一个RegistryKey处理它吗?

我已经查看了我能找到的所有文档,并且在任何地方都没有提到这一点.

c# registry

6
推荐指数
1
解决办法
1721
查看次数

释放 VC++ 2019 中 std::vector 的内存

我最近开始将我当前的项目从 VS2015 升级到 VS2019,而 VS2019 对某些事情的限制要大得多。我特别有问题的一件事是我目前释放向量内存的方式:

std::vector<int> v(10);
v.swap(std::vector<int>()); // v should now be empty with no memory held
Run Code Online (Sandbox Code Playgroud)

这在 VS2015 中运行良好,但在 VS2019 中它不再起作用,因为我与之交换的向量是常量并且vector::swap()需要引用。这种行为最近发生了变化,对于比我更多的人来说肯定是个问题,因为这是释放向量内存的推荐方式。有关该问题的 MS 文档:https : //docs.microsoft.com/en-us/cpp/error-messages/compiler-errors-2/compiler-error-c2664?view=msvc-160

如果你不能把它交换掉,释放向量的内存的新推荐方法是什么?

c++ visual-studio-2019

2
推荐指数
1
解决办法
77
查看次数

PHP短路评估

我有这个代码:

if (!in_array('array_item', $body) || !is_int($body['array_item']))
    throw new Exception();
Run Code Online (Sandbox Code Playgroud)

现在由于短路is_int,如果array_item不存在,我希望不会执行$body.但是我仍然从PHP那里得到关于"undefined index array_item"的抱怨,我假设它来自$body['array_item'].

有人可以向我解释为什么$body['array_item']不执行is_int

php operators short-circuiting

0
推荐指数
1
解决办法
406
查看次数