小编Ded*_*eak的帖子

Default new alignment

I'm moving some C++17 code to be used in a project that is built with Qt, on Windows, using MinGW 7.3.0, and noticed something weird happening in the 32bit builds:

#include <cstddef>
#include <iostream>
int main() {
  std::cout << __STDCPP_DEFAULT_NEW_ALIGNMENT__ << std::endl;
  std::cout << __BIGGEST_ALIGNMENT__ << std::endl;
  std::cout << sizeof(std::max_align_t) << std::endl;
  std::cout << alignof(std::max_align_t) << std::endl;    
  std::cout << "----------------------------------------" << std::endl;    
  for (int i = 0; i < 8; ++i) {
    const uintptr_t        ptr   = uintptr_t(new char);
    static const …
Run Code Online (Sandbox Code Playgroud)

c++ default mingw memory-alignment new-operator

7
推荐指数
0
解决办法
89
查看次数

QApplication 后的清理

我正在将 Qt 桌面应用程序移植到 Linux(Ubuntu 19.10,64 位桌面,Qt 5.12.5,gcc 版本 9.2.1),并且在 QApplication 完成后我看到一些意外的线程保持活动状态。

这是最低限度的再现:

#include <QApplication>
#include <unistd.h>
int main(int argc, char * argv[]) {
    {
        QApplication app(argc, argv);
        sleep(1);
    }
    sleep(10);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我在不同的时间点调试应用程序,我会看到以下内容:

  • 在运行 QApplication 的构造函数之前,正如预期的那样,只有一个线程,即主线程,存在。
  • 运行 QApplication 的构造函数后,会创建 4 个额外的线程:
    • QXcbEventQueue
    • 主界面
    • 总线
    • QDBusConnection
  • QApplication 的析构函数运行后,QXcbEventQueue 线程消失。
  • 即使在 10 秒的第二次睡眠完成后,除了主线程之外,其他 3 个线程仍然活着:
    • 主界面
    • 总线
    • QDBusConnection

在 QApplication 完成后,我正在寻找一种方法来正确结束这些线程(并进行我目前可能不知道的其他清理工作)(当然,在实际应用程序中,我调用 app.exec() 并执行其他东西)并已被销毁。

这不是应用程序本身的问题,在这 3 个线程仍然活着的情况下到达 main 的末尾似乎没有问题。

该应用程序是使用 Google Test 进行全面测试的更大的库/其他应用程序套件的一部分,这些测试包括一些死亡测试,如果在运行了一些涉及运行 QApplication 的测试后执行,则会抱怨分叉应用程序有多个线程,并且卡住并且永远不会完成,大概是因为这个原因。

关于我如何能够摆脱这些线程并在 QApplication 之后执行完全清理的任何提示?

linux qt multithreading googletest qapplication

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

Firebase Analytics如何处理会话持续时间/超时?

我正在使用Firebase Analytics在Android/iOS应用中首次实现一些基本的使用统计信息,但对于我如何精确计算会话持续时间以及会话超时的时间以及24小时这些文档似乎有些含糊不清看到结果的循环无助于通过反复试验来理解.

我现在只对一个非常简单的统计数据感兴趣 - 用户在应用程序中花费的时间.当应用程序"最小化"/"在后台"时确实发生了什么 - 这是否算作活动使用或与应用程序关闭相同 - 现在不是那么重要,但是如果你在这方面需要添加一些内容问题的背景,请做.

根据我的理解,这样一个简单的统计数据应该可以直接与Firebase Analytics一起使用,所以我目前没有使用任何自定义事件或任何比仅仅将Firebase Analytics链接到项目中的更好的事情,添加配置文件,并调用FirebaseAnalytics.getInstance(this); 在Android和[FIRApp配置]; 在iOS上.

我看到first_open,session_start和app_remove事件在控制台中按预期显示,仪表板中的一些聚合会话数据等,我也知道可用的可配置会话超时.

但我不清楚的是,当用户会话确实到期时 - 只要应用程序处于打开状态,Firebase会自动保持打开状态,或者我是否需要确保发布一些人为的"保持活动"事件以防止用户当用户仍在使用该应用时,会话即将到期.

假设如下:

  1. 我没有使用Firebase发送明确的自定义事件,因为应用程序并未明确要求.
  2. 我只在一次运行应用程序时触摸Firebase一次 - 在启动时初始化它.
  3. 用户长时间停留在应用程序中(假设2小时 - 比默认的30分钟会话超时时间长得多),无需与之交互 - 例如阅读内容,观看视频等,这些都不会产生Firebase的任何事件可以看到,但应用程序阻止屏幕锁定,应用程序保持在前台.

对于用户来说,这会算作一个2小时的会话吗?自会话在30分钟后到期以来是否仅计为30分钟会话并且没有生成任何事件以使其保持活动状态?会发生什么事吗?

额外问题:如果用户退出应用程序的时间比会话超时短或长,会发生什么?

奖金红利问题:如果不是从应用程序退出,它会变成背景吗?

谢谢!

session timeout duration firebase-analytics

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

lcov woes:奇怪的重复构造函数标记为未覆盖&函数未标记为已覆盖,即使其行已执行

在我通过以100%覆盖率启动并运行小型C++测试项目来了解有关自动化测试的更多信息的过程中,我遇到了以下问题 - 即使我的所有实际代码行和所有执行分支都被测试覆盖,lcov仍然报告两行未经测试(它们只包含函数定义),以及一个"重复"的构造函数方法,即使它与我的"真实"构造函数(唯一一个定义和使用过的)完全匹配,也可以是未经测试的.

(跳至编辑最小的复制案例)

如果我使用gcovr python脚本生成相同的覆盖率统计信息(来自相同的源,.​​gcno和.gcda文件)并将结果传递给Jenkins Cobertura插件,它会给我100%的所有计数 - 行,条件和方法.

这就是我的意思:

Jenkins Cobertura Coverage页面:http://gints.dyndns.info/heap_std_gcovr_jenkins_cobertura.html(一切都在100%).

使用lcov处理相同的.gcda文件:http://gints.dyndns.info/heap_std_lcov.html (标记为未执行的两个函数定义行,即使这些函数中的行被完全覆盖,以及函数Hit =函数Total - 1).

来自lcov的源文件的函数统计信息:http:// gints.dyndns.info/heap_std_lcov_func(显示两个相同的构造函数定义,两者都引用文件中的相同代码行,其中一行标记为命中5次,另一行0次).

如果我查看中间的lcov .info文件:http://gints.dyndns.info/lcov_coverage_filtered.info.txt我看到有两个构造函数定义,两者都应该在同一行:FN:8 ,_ZN4BBOS8Heap_stdC1Ev&FN:8,_ZN4BBOS8Heap_stdC2Ev.

哦,并不介意.uic包含/析构函数周围的混乱,这只是处理gcov报告的析构函数中的分支的一种肮脏方式?当我拍摄这些文件快照时,我碰巧尝试了.

有人建议如何解决这个问题?C++编译器在这里做了一些"幕后"的魔术吗?(特殊目的的构造函数的额外副本,我应该确保从我的测试中调用,也许?)常规函数定义怎么样 - 即使主体已经过全面测试,定义行怎么能不被测试?这只是lcov的一个问题吗?欢迎提出任何建议 - 我想了解为什么会发生这种情况,如果真的有一些功能我的测试没有被发现,而Cobertura没有抱怨......或者如果没有,我如何让lcov明白这一点?

编辑:在下面添加最小的repro方案

lcov_repro_one_bad.cpp:

#include <stdexcept>
class Parent {
public:
    Parent() throw() { }
    virtual void * Do_stuff(const unsigned m) throw(std::runtime_error) =0;
};

class Child : public Parent {
public:
    Child() throw();
    virtual void * Do_stuff(const unsigned …
Run Code Online (Sandbox Code Playgroud)

c++ constructor code-coverage definition lcov

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

C++:转发声明类型def

我们正在尝试使用http://cpp-netlib.org并且无法编译它,因为它的一个标题中包含:

namespace network {
    namespace utils {
        struct thread_pool;
    }
}
Run Code Online (Sandbox Code Playgroud)

在另一个:

namespace network {
        namespace utils {
            typedef ::network::concurrency::thread_pool thread_pool;
    }
}
Run Code Online (Sandbox Code Playgroud)

从我了解,从C++中一个typedef的向前声明和http://www.cplusplus.com/forum/beginner/75561在C++中,这基本上违法-你就不能向前声明:"结构A;" 然后尝试"typedef XA;".

那么,我的问题是,他们究竟在编译什么呢?这是C++ 11的一些新功能,因为它们声称使用最新的C++ 11?

c++ typedef forward-declaration c++11

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