小编Tho*_*ell的帖子

在调用 abort() 时设置断点

我正在调试一个应用程序,出于某种原因(我不太确定),在关闭我的应用程序时abort()被调用。我想尝试找出原因,所以我想在上面放置一个断点,abort()这样我就可以看到堆栈跟踪,并希望发现它被调用的原因,而不是正常退出。

我正在使用 Microsoft Visual Studio 2012(更新 3)并且只有abort()函数的声明(in stdlib.h),因此我无法设置断点。有没有办法解决这个问题?

c++ debugging breakpoints abort visual-studio-2012

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

等待 24 小时的线程的潜在系统成本

在我正在编写的应用程序中,我希望每 24 小时备份一次数据,以帮助防止因文件损坏或其他故障而丢失数据的风险。

为此,我使用一个像这样的简单线程:

void BackupThread( const std::atomic<bool>& bTerminateFlag )
{
    std::stringstream ssFilePathAndName;

    while( !bTerminateFlag.load() )
    {
         std::this_thread::sleep_for( std::chrono::hours(24) );

         std::time_t std::chrono::system_clock::to_time_t( std::chrono::system_clock::now() );

         ssFilePathAndName << "\\Backup" << "\\BackupFile-" << std::put_time( std::localtime( &t ), "%Y-%m-%d-%H-%M-%S" ) << ".txt";

         // Save the data using our thread-safe Singleton object:
         g_pManager->Save( ssFilePathAndName.str() );

         ssFilePathAndName.str( "" );
         ssFilePathAndName.clear();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,我使用对主应用程序类的成员变量的引用来开始此操作:

m_backupThread = std::thread( BackupThread, std::cref( m_bBackupTerminateFlag ) );
Run Code Online (Sandbox Code Playgroud)

但是,我很好奇这是否是处理此过程的坏方法(系统资源方面),因为尽管我已指定线程必须在唤醒前等待 24 小时,但线程可能会在不同的点恢复由调度程序/操作系统检查时间条件,我担心这是否会导致不可忽略的电量或CPU时间被浪费(考虑到这将在系统上持续运行很长一段时间,并且它不会是系统上运行的唯一进程)。

c++ multithreading power-management c++11

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

std :: enable_if在Visual Studio 2013中无法正常工作

我正在用C++编写一个小型库,我只想在模拟算术类型的情况下实例化模板,我发现了以下问题:

如果我有以下定义Foo:

template<typename T, typename Enable = void>
class Foo;

template<typename T>
class Foo<T, std::enable_if<std::is_arithmetic<T>::value>::type> {
    Foo() = default;
    Foo( const Foo& ) = default;
    ~Foo() = default;

    template<typename U>
    Foo( std::initializer_list<U> list )
    {
        static_assert(std::is_convertible<U, T>::value, "Must use an initializer list with type convertible to T");

        for( std::size_t s = 0; s < 10; ++s )
        {
            tArray[s] = static_cast<U>(list[s]);
        }
    }

private:
    T       tArray[10];
};
Run Code Online (Sandbox Code Playgroud)

我尝试按如下方式初始化它:

int main()
{
    Foo<int> test{ {1, 2, 3, 4, 5, …
Run Code Online (Sandbox Code Playgroud)

c++ templates enable-if template-meta-programming c++11

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

高效安全地分配唯一ID

我正在编写一个数据库,我希望为特定类型的每个项目分配一个唯一的ID(用于内部数据管理).但是,数据库预计会运行很长时间(理论上无限),并且条目的周转率很高(因为条目被删除并定期添加).

如果我们将我们的唯一ID建模为a unsigned int,并假设数据库中始终存在少于2^32 - 1(我们不能0用作唯一ID)条目,我们可以执行以下操作:

void GenerateUniqueID( Object* pObj )
{
    static unsigned int iCurrUID = 1;
    pObj->SetUniqueID( iCurrUID++ );
}
Run Code Online (Sandbox Code Playgroud)

但是,这很好,直到条目开始被删除,其他的添加到它们的位置,可能仍然少于2^32-1条目,但我们可能溢出iCurrUID并最终分配已经被使用的"唯一"ID.

我有一个想法是使用a std::bitset<std::numeric_limits<unsigned int>::max-1>然后遍历它来找到第一个免费的唯一ID,但是这将具有高内存消耗并且将线性复杂度找到一个免费的唯一ID,所以我正在寻找更好的方法,如果一个存在?

提前致谢!


我知道将数据类型更改为64位整数而不是32位整数将解决我的问题; 但是,因为我在Win32环境中工作,并使用列表(DWORD_PTR32位),我正在寻找替代解决方案.此外,数据通过网络发送,我试图通过使用更小的唯一ID来减少带宽消耗.

c++ database performance unique

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

if(cond){}和else {if(cond){}}之间的性能差异

我今天正在重写我的一些旧代码以优化它并使其更易读(因为其中一些非常粗略地注释)并且我想知道这些代码块之间是否存在任何技术性能差异:

if( cond1 )
{
     // Do something.
}
else if( cond2 )
{
     // Do something else.
}
Run Code Online (Sandbox Code Playgroud)

和:

if( cond1 )
{
     // Do something.
}
else 
{
     if( cond2 )
     {
          // Do something else.
     }
}
Run Code Online (Sandbox Code Playgroud)

我告诉自己应该没有性能成本,因为应该进行相同数量的比较,但我只是好奇是否有一些我忽略的东西.

c++ performance conditional

-2
推荐指数
2
解决办法
140
查看次数