struct Line
{
Bounds bounds_;
Vector origin_;
uint32_t begin_;
uint32_t end_;
dist ascent_;
dist descent_;
};
Run Code Online (Sandbox Code Playgroud)
使用如下:
Line line = {};
while (!parser.done()) {
line = Line(); // zero-initialize
...
}
Run Code Online (Sandbox Code Playgroud)
Bounds
并且Vector
是非POD类,dist
是一个typedef int64_t
.
但是,VC++ 11的优化32位版本构建似乎line
在while循环中至少留下了未初始化的部分内容.为什么?根据Do,括号后的类型名称与new有所区别?,它应该零初始化它,对吧?
我将struct成员的值记录到文件中:
Line line = {};
:非POD类型默认初始化,其他类型为0.line = Line();
:POD类型仍默认初始化,其他包含随机值.在我的一个项目中,我确定了std::deque<T>::clear()
一个主要的瓶颈.
因此,我决定在专用的低优先级线程中移动此操作:
template <class T>
void SomeClass::parallelClear(T& c)
{
if (!c.empty())
{
T* temp = new T;
c.swap(*temp); // swap contents (fast)
// deallocate on separate thread
boost::thread deleteThread([=] () { delete temp; } );
// Windows specific: lower priority class
SetPriorityClass(deleteThread.native_handle(), BELOW_NORMAL_PRIORITY_CLASS);
}
}
void SomeClass:clear(std::deque<ComplexObject>& hugeDeque)
{
parallelClear(hugeDeque);
}
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常(VisualC++ 2010),但我想知道我是否忽略了任何重大缺陷.我欢迎您就上述代码发表意见.
其他信息:
SomeClass:clear()
从GUI线程调用,用户界面无响应,直到调用返回.的hugeQueue
,而另一方面,是不可能被通过该线程几秒钟后清除访问.
我正在使用OpenGL(而不是DirectX)编写CAD应用程序.在Windows 8 Pro(64位)上运行调试版本时,在应用程序正确终止之前,会将以下消息打印到调试器的控制台窗口:
DXGI WARNING: Process is terminating. Using simple reporting. Please call ReportLiveObjects() at runtime for standard reporting. [ STATE_CREATION WARNING #0: ]
DXGI WARNING: Live Producer at 0x0000009E51808AD8, Refcount: 2. [ STATE_CREATION WARNING #0: ]
DXGI WARNING: Live Object at 0x0000009E5180A570, Refcount: 2. [ STATE_CREATION WARNING #0: ]
DXGI WARNING: Live Object : 1 [ STATE_CREATION WARNING #0: ]
Run Code Online (Sandbox Code Playgroud)
我不知道这是从哪里来的.DXGI似乎与DirectX有关,我没有使用它.任何提示?
按照Paul-Jan的建议,我启用了设备调试,产生以下消息:
D3D11 INFO: Create ID3D11Context: Name="unnamed", Addr=0x00000015EEB486D0, ExtRef=1, IntRef=0 [ STATE_CREATION INFO #2097225: CREATE_CONTEXT]
D3D11 INFO: Create …
Run Code Online (Sandbox Code Playgroud) 我现在愚蠢地解决这个问题......
我得到一个BCD号码(每个数字都是一个自己的4Bit表示)
例如,我想要的:
输出:BCD 0x415
输入:0x202
我试过了什么:
unsigned int uiValue = 0x202;
unsigned int uiResult = 0;
unsigned int uiMultiplier = 1;
unsigned int uiDigit = 0;
// get the dec bcd value
while ( uiValue > 0 )
{
uiDigit= uiValue & 0x0F;
uiValue >>= 4;
uiResult += uiMultiplier * uiDigit;
uiMultiplier *= 10;
}
Run Code Online (Sandbox Code Playgroud)
但我知道这是错误的,这将是位表示202,然后分成5个半字节,然后再次表示为十进制数
我可以在纸上解决问题,但我不能用一个简单的C代码来解决它