小编Mar*_*som的帖子

C++ 03中default-initialize和value-initialize之间的区别?

我一直认为创建一个新对象总是会调用一个对象的默认构造函数,而构造函数是显式的还是由编译器自动生成的没有区别.根据对这个不同问题的高度重视的答案,这在C++ 98和C++ 03之间以微妙的方式发生了变化,现在的工作原理如下:

struct B { ~B(); int m; }; // non-POD, compiler generated default ctor 
new B;   // default-initializes (leaves B::m uninitialized)
new B(); // value-initializes B which zero-initializes all fields since its default ctor is compiler generated as opposed to user-defined.
Run Code Online (Sandbox Code Playgroud)

谁能告诉我:

  1. 为什么标准发生了变化,即这给了什么优势,或者现在可能有什么优势;
  2. "default-initialize"和"value-initialize"这两个术语是什么意思?
  3. 该标准的相关部分是什么?

c++ standards default-value default-constructor

8
推荐指数
1
解决办法
1672
查看次数

迭代正在改变的std :: list的有效方法?

我正在尝试迭代std::list但是有一个问题 - 在迭代期间执行的操作可能最终添加或从列表中删除元素.在这种情况下,添加不是问题,但删除可能最终使列表中的任何迭代器无效,包括序列中的当前或下一项.

决定修改列表的点远离迭代循环 - 调试器在两者之​​间的调用堆栈中显示40个函数调用.因此,无法根据删除修改迭代器.

我唯一能想到的是在开始时复制列表并迭代它,测试每个元素以确保它仍然在主列表中.这是一个O(n ^ 2)命题,如果可能的话,我想避免.

c++ iterator list

8
推荐指数
1
解决办法
377
查看次数

GPU:将浮点顶点坐标转换为定点.如何?

我基本上试图了解在光栅化过程中将浮点顶点坐标转换为定点数时GPU是如何工作的.

我读过这篇很好的文章,它解释了很多东西,但它也让我困惑.所以文章解释说因为我们使用32位整数和边缘函数,如下面的形式(a - b)*(c - d) - (e - f)*(g - h),我们被限制在范围[-16384,16383].我理解我们如何得到这个数字.这是我的问题:

  1. 首先,这表明顶点坐标可以是负的.然而我不明白的是,技术上在那个阶段顶点坐标在光栅空间中,并且所有三角形之前都应该被剪裁.因此,从技术上讲,x坐标的范围[0,图像宽度]和y坐标的[0,图像高度]应该只有顶点坐标?那么为什么坐标为负?
  2. 所以作者解释了范围太有限[-16384,16383].实际上,如果你的宽度为2048像素并使用256个子像素,那么x中点的坐标需要为4194048.这样你就会溢出.作者继续前进,并解释他们是如何在GPU上解决这个问题的,但我根本就没有得到它.如果有人也可以解释它在GPU上的实际操作方式,那就太棒了.

3d rendering gpu

8
推荐指数
1
解决办法
525
查看次数

同情的任何方式做整数除法?

我有一个很长的表达,我认为可以简化,我认为sympy这将是完美的方式.不幸的是,公式依赖于几个整数除法,我找不到任何方法来表示那些sympy.

>>> x=Symbol('x')
>>> (x+1)/2
x/2 + 1/2
Run Code Online (Sandbox Code Playgroud)

显然不是我想要的,1/2不是整数.

>>> (x+1)//2
TypeError: unsupported operand type(s) for //: 'Add' and 'int'
Run Code Online (Sandbox Code Playgroud)

显然sympy不处理//.

>>> Integer((x+1)/2)
#   A long list of error messages, ending with ...
TypeError: Integer can only work with integer expressions.
Run Code Online (Sandbox Code Playgroud)

似乎Integer只是为了处理常数而不是公式.

有一个功能,trunc但它似乎没有做任何类似于我想要的东西.

有没有办法表示整数除法sympy

python sympy integer-division

8
推荐指数
1
解决办法
559
查看次数

为什么0.1 + 0.4 = 0.5?

我们知道浮点数被打破了,因为十进制数不能总是用二进制来完美表示.它们四舍五入到可以用二进制表示的数字; 有时这个数字更高,有时它更低.在这种情况下,使用无处不在的IEEE 754双格式,高0.1和0.4:

0.1 = 0.1000000000000000055511151231257827021181583404541015625
0.4 = 0.40000000000000002220446049250313080847263336181640625
Run Code Online (Sandbox Code Playgroud)

由于这两个数字都很高,你可以期望它们的总和也很高.完美的添加应该会给你0.5000000000000000277555756156289135105907917022705078125,但你会得到一个很好的确切0.5.为什么?


问题浮点数学是否破碎?已经在上面确定了,但这个问题是不同的.在考虑该问题的答案时,它要求对非直观结果进一步详细说明.

language-agnostic math floating-point floating-accuracy

7
推荐指数
2
解决办法
261
查看次数

整数除法:对于所有整数a,b,// b == int(a/b)为真?

我知道如果数字都是正数,则整数除法将始终返回与浮点结果截断相同的答案.如果其中一个或两个都是否定的,这是真的吗?

我只是想知道是否有一个整数除法表达式会在Python 2和Python 3中返回相同的结果(是的,我知道from __future__ import division).

PS让我们暂时忽略浮点溢出.

python integer-division python-3.x

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

编译器是否优化了未使用的参数?

假设我有一个非常简单的内联函数:

void Trace(int i)
{
#ifdef _DEBUG
    std::cout << i << std::endl;
#endif
}
Run Code Online (Sandbox Code Playgroud)

现在我用另一个需要很长时间的函数生成的参数来调用这个函数:

Trace(SlowFunc());
Run Code Online (Sandbox Code Playgroud)

一个合理的编译器会优化调用到SlowFunc()释放模式吗?MSVC会特意做到吗?

c++ optimization

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

什么可能阻止DLL加载LoadLibrary?

我有一个JD Edwards业务功能,它是用Microsoft Visual C++编写的一个C模块.我正在使用LoadLibrary访问第三方DLL.在一个独立的测试程序中,代码运行得很好.当我在JDE中运行它时,LoadLibrary返回NULL并且GetLastError返回126,这意味着The specified module could not be found根据MSDN.我已经尝试放入DLL的完整路径,是的,我记得要加倍路径中的\字符.没有不同.

我已经检查过以确保没有依赖项会阻止DLL加载; DUMPBIN/DEPENDENTS返回以下内容:

WSOCK32.dll
USER32.dll
GDI32.dll
WINSPOOL.DRV
ADVAPI32.dll
KERNEL32.dll
Run Code Online (Sandbox Code Playgroud)

这些看起来像标准的Windows DLL,所以我很茫然.

dll jdedwards loadlibrary visual-c++

5
推荐指数
1
解决办法
9975
查看次数

Windows 位图和 DIBSection 之间有什么区别?

我正在从具有以下内容的文件加载 DIBSection:

HBITMAP bmpIn = (HBITMAP) LoadImage(NULL, _T("c:\\Temp\\Temp.bmp"), IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE);
Run Code Online (Sandbox Code Playgroud)

根据经验,我发现加载的位图和我过去使用的位图之间存在以下差异,但我找不到任何文档说明应该存在差异。

  • 这些行在内存中是自上而下而不是自下而上排序的。我已经验证 .bmp 文件本身是自下而上排序的。
  • 行填充是 2 字节的倍数而不是 4 字节。

CreateDIBSection当您使用从头开始创建 DIBSection时,我还发现了一个已记录的差异。

  • 返回的 DIBSECTION.dsHandle 和 BITMAP.bmBits 值GetObject将为 NULL。

前两个差异的文档在哪里,我是否遗漏了什么?这是 Windows 7 的情况,但我无法想象其他版本的 Windows 会有什么不同。

编辑:一些额外的细节。这是一个十六进制转储temp.bmp;它是一个 7x7 的图像,右侧有白色条纹,蓝色值沿左侧递增(0x10、0x20 等)。您可以看到底线 (00,00,70) 位于第一行,并且有 3 个字节的填充。

00: 42 4d de 00 00 00 00 00 00 00 36 00 00 00 28 00
10: 00 00 07 00 00 00 07 00 00 00 01 …
Run Code Online (Sandbox Code Playgroud)

windows bitmap dib

5
推荐指数
1
解决办法
3041
查看次数

如何一致地绘制基维线

我试图在按钮中间画一个简单的“X”。我已经输入了以下绘图代码:

    width, height = self.size
    x, y = self.pos
    x1, x2 = x + int(width*0.3), x + int(width*0.7)
    y1, y2 = y + int(height*0.3), y + int(height*0.7)
    with self.canvas:
        Line(points=[x1, y1, x2, y2], width=1, cap='none')
        Line(points=[x2, y1, x1, y2], width=1, cap='none')
    self.canvas.ask_update()
Run Code Online (Sandbox Code Playgroud)

两条对角线虽然使用完全相同的整数坐标,但绘制的方式不同。左上角到右下角被绘制别名,另一个不是。我怎样才能使它们一致?

在此处输入图片说明

我应该提到我正在使用 Windows 版本的 kivy 进行测试,我还没有在任何其他平台上尝试过。

python opengl kivy

5
推荐指数
1
解决办法
917
查看次数