小编Dan*_*ger的帖子

POD零初始化

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成员的值记录到文件中:

  • after Line line = {};:非POD类型默认初始化,其他类型为0.
  • 之后line = Line();:POD类型仍默认初始化,其他包含随机值.

c++ initialization pod visual-c++ compiler-bug

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

在专用线程中清除STL

在我的一个项目中,我确定了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,而另一方面,是不可能被通过该线程几秒钟后清除访问.

c++ multithreading stl c++11

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

在Windows 8上使用OpenGL时出现DXGI警告?

我正在使用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)

opengl directx dxgi windows-8

4
推荐指数
1
解决办法
4046
查看次数

将整数从(纯)二进制转换为BCD

我现在愚蠢地解决这个问题......

我得到一个BCD号码(每个数字都是一个自己的4Bit表示)

例如,我想要的:

  • 输入:202(十六进制)== 514(十进制)
  • 输出:BCD 0x415

  • 输入:0x202

  • 位表示:0010 0000 0010 = 514

我试过了什么:

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代码来解决它

c binary bcd

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