小编Swi*_*ank的帖子

如何使用 C 预处理器查找 glibc 版本?

从 2.19 开始,glibc 需要_DEFAULT_SOURCE被定义才能stdlib.h定义putenv()。在此之前它需要_SVID_SOURCE.

有什么方法可以让代码神奇地检测它所拥有的 glibc 版本,从而定义正确的_SOURCE符号,甚至是 glibc 是否存在?

glibc c-preprocessor

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

读者/写者锁...没有读者锁?

我感觉这可能是一种非常普遍和常见的情况,对此有一个众所周知的无锁解决方案。

简而言之,我希望有一种像读取器/写入器锁这样的方法,但这不需要读取器获取锁,因此可以获得更好的平均性能。

相反,对于读取器来说会有一些原子操作(128 位 CAS),对于写入器来说会有一个互斥锁。我有数据结构的两个副本,一个用于正常成功查询的只读副本,以及一个要在互斥锁保护下更新的相同副本。将数据插入可写副本后,我们将其设为新的可读副本。一旦所有待处理的读取器都读完它,旧的可读副本就会被依次插入,写入器会旋转剩余的读取器数量,直到其为零,然后依次修改它,最后释放互斥体。

或类似的东西。

存在这样的东西吗?

c++ concurrency lock-free lockless stdatomic

6
推荐指数
2
解决办法
2740
查看次数

C++程序需要文件关联

我正在分发一个免费软件产品,它可以读取和写入具有唯一扩展名的文本文件.我希望双击这样的文件会自动启动应用程序.

在Windows 7 Professional上进行开发时,我设置了一个关联来双击打开我的文件,右键单击文件 - >打开方式...->选择默认程序...->浏览...后跟"始终使用所选程序打开此类文件." 好.它完成了它所需要的.我打算发送我的程序,指示用户也这样做.

但是,当我移动二进制文件的位置时,我看到"始终使用"现在变灰/不敏感,所以虽然我可以浏览到新的二进制文件但我无法将其设置为默认值.由于我认为我的用户也会遇到这个问题,我想看看我是否可以安装或运行该程序来处理映射.

我查看了Windows Installer大约5分钟,然后才确定它比我需要的功能和复杂性要多得多(根据我的需要,除了这个文件映射之外,zip文件就足够了.)

所以我看一下我的程序,在启动时,如果它已经没有那么设置映射本身.(我知道如果我们讨论的是常见的文件类型,例如.html或.jpg,这将是非常糟糕的行为,但在这种情况下,它的一些.blahblah扩展名肯定没有其他人用于任何东西.)

根据http://www.cplusplus.com/forum/windows/26987/http://msdn.microsoft.com/en-us/library/cc144148(v=vs.85).aspx上的信息,我能够让我的程序在启动时打开HKEY_CLASSES_ROOT\.blahblah并确认(并在需要时更改)默认文本以准确描述文件(替换一些默认情况下我最后进行手动关联时创建的文本)夏季).但是,当创建HKEY_CLASSES_ROOT\firm.app.1\shell\open \命令时,我的RegCreateKeyEx()包装器可以正常工作以更改\ .blahblah的值,现在返回代码5,显然缺少权限.

经过进一步研究,似乎权限模型可能导致所有此类请求失败.任何人都可以确认或否认这个吗?如果确认,我应该研究一下这个问题吗?

否则,有什么建议?我应该咬紧牙关学习Windows Installer吗?或者有没有办法获得我自己的软件第一次启动时编辑注册表所需的权限?

注意我正在使用Windows 7 Professional上的Visual Studio 2008进行开发,虽然仍然是业余Windows程序员,但自从80年代以来我在Unix/Linux上一直在做C++ ...

c++ windows registry windows-installer file-association

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

Red Hat: using <atomic> compiles fine but linker can't find __atomic_store_16; what library?

I'm using atomic<> for the first time, and just as using <thread> requires you to link a thread library, it seems like using <atomic> wants you to do... something. What?

> uname -a
Linux sdclxd00239 3.10.0-693.11.6.el7.x86_64 #1 SMP Thu Dec 28 14:23:39 EST 2017 x86_64 x86_64 x86_64 GNU/Linu

> g++ Foo.cxx -g -o MsgQueueNoLock -pthread
/tmp/ccnGOKUG.o: In function `std::atomic<Ptr_T>::store(Ptr_T, std::memory_order)':
/opt/rh/devtoolset-7/root/usr/include/c++/7/atomic:239: undefined reference to `__atomic_store_16'
/tmp/ccnGOKUG.o: In function `std::atomic<Ptr_T>::load(std::memory_order) const':
/opt/rh/devtoolset-7/root/usr/include/c++/7/atomic:250: undefined reference to `__atomic_load_16'
collect2: error: ld returned 1 …
Run Code Online (Sandbox Code Playgroud)

c++ gcc redhat linker-errors stdatomic

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

如何在 C++ 中 printf() std::this_thread::get_id() ?

我尝试过投射void*并使用%p. 我也尝试intptr_t过使用%lx. 两次我都收到“无效演员”错误。

我正在使用-Wall -Werror它检查函数的参数是否与printf()函数的格式字符串匹配。因此,我不能仅仅指望get_id()在堆栈上留下 4 或 8 字节值并简单地将该值打印为十六进制。

我正在使用 gcc 版本 9.2.1 20190827 (Red Hat 9.2.1-1) (GCC)

操作系统是 Fedora 版本 31(三十一)。CPU 是 64 位 Intel x86。

multithreading c++11

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

简单的 AVX512 点积循环仅快 10.6 倍,预期快 16 倍

任务是将数组 A 中的每个浮点数与数组 B 中的相应元素相乘的乘积求和。数组可能有数万个元素,并且必须运行 100,000 倍秒才能处理实时数据流,因此性能是关键。

我使用常规数学对其进行了编码,并再次使用 AVX512 对其进行了编码。它大约快了 10.6 倍,这令人惊讶,因为我预计每条指令执行 16 倍的操作,所以速度会快 16 倍左右。此外,虽然循环有各种开销(例如,循环变量、增量、如果继续循环则分支等),但与原始版本相比,它只执行了 1/16。

我正在 Visual Studio 2022 Community 中以发布模式进行编译,并在 i7-11700F 上运行。

这是代码行。我基本上一次遍历两个数组 16 个元素,将各个元素相乘,并保留 16 个运行和。在计算的最后,我_mm512_reduce_add_ps()对这 16 个和进行求和。

vector<__m512>      a512In;
vector<__m512>      a512IRCurr;
__m512 fOut = _mm512_set1_ps( 0.0 );

for ( iSample = 0; iSample < iIterations; iSample++ ) 
    fOut = _mm512_add_ps( fOut, _mm512_mul_ps( a512In[ iPos++ ],
                                               a512IRCurr[ iSample ] ) );
Run Code Online (Sandbox Code Playgroud)

我发现vmobups并没有假设目标是一致的,并且想知道这是否是问题所在。不过,我还发现,许多代未对齐版本的速度与对齐版本相同,但令人不安的是延迟可能仍然不同:https ://community.intel.com/t5/Intel-ISA-Extensions/what -are-the-performance-implications-of-using-vmovups-and/mp/1143448 虽然我对 6502 品种的机器语言很满意,但我不了解现代英特尔。

我还想知道这是否_mm512_add_ps是正确的a …

c++ performance avx dot-product avx512

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

CRichEditCtrl 在获得焦点时选择所有文本

我有一个带有菜单和 CTabCtrl 的对话框。CTabCtrl 有一个选项卡,其中包含一个 CDialog。反过来,它包含一些静态文本和一个 CRichEditCtrl。窗口获得和失去焦点没有特别的问题。

我自从添加了第二个相同的选项卡,现在每次更改选项卡时,CRichEditCtrl 中的所有文本显然都被选中。它以反转的配色方案显示,如果您按下一个键,所有文本都会被替换。

标志 ECO_NOHIDESEL 的描述说(强调我的):

否定编辑控件的默认行为。默认行为在控件失去输入焦点时隐藏选择,并在控件接收输入焦点时显示选择。如果指定 ECO_NOHIDESEL,则即使控件没有焦点,所选文本也会反转。

“显示选择”对我来说听起来像是“显示此控件上次获得焦点时的任何选择”,这不是正在发生的事情。通常在失去焦点之前没有选择任何内容,但是如果我确实尝试离开选择,请返回另一个选项卡并返回,整个文本像往常一样被选中。

可以阻止这种选择吗?

void EditorDialog::OnTabSelChange(NMHDR * phdr, LRESULT* pResult) {

  CTabCtrl* ptab = (CTabCtrl*) GetDlgItem( IDC_TAB );

  int iPageActive = ptab->GetCurSel();

  if ( iPageActive >= appage.N() ) {
      AKS( AKSWarn, "got tab change to tab %d when I only have %d ppages", iPageActive, appage.N() );
      return;
  }

  ppageActive = appage[ iPageActive ];

  SetActivePagePos();

  SCWinUtilSetWindowTextVA( this, "Editor: %s", ppageActive->pszFileName );
}



void EditorDialog::SetActivePagePos() {

  // STEP 1: …
Run Code Online (Sandbox Code Playgroud)

c++ mfc focus selection cricheditctrl

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

按位移位运算符似乎换行了?

这是Windows 7 32位Visual Studio 2017,位于C文件中。

int i = 65536;
Run Code Online (Sandbox Code Playgroud)

不出所料

i >> 0 = 65536
i >> 1 = 32768
  :
  :
i >> 16 = 1
i >> 17 to 31 = 0.
Run Code Online (Sandbox Code Playgroud)

我>> 32再次神奇地是65536。那怎么合法?

ISO / IEC 9899:TC2表示以下内容,并且我认为C ++规范相同吗?

E1 >> E2的结果是E1右移E2位的位置。如果E1具有无符号类型,或者E1具有带符号类型和非负值,则结果的值是E1 / 2 ^ E2商的整数部分。如果E1具有带符号的类型和负值,则结果值是实现定义的。

c bit-shift bitwise-operators

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

在 std::lock_guard&lt;&gt; 的声明中添加 const 有什么意义?

在一些示例代码中,我看到以下内容const

const std::lock_guard<std::mutex> lock( mux );
Run Code Online (Sandbox Code Playgroud)

在其他一些示例中,没有const

任何技术或语义差异?const 是否以某种方式向读者发出有趣的信号?例如,它是否旨在提醒他们锁定不会再发生任何事情?

multithreading mutex constants c++11

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

为 C++17 构建时,__cplusplus 在 Visual Studio 2022 中显然未正确设置?

我的代码进行了以下测试,以保护仅适用于 C++11 或更高版本的代码。

cl尽管用 调用,但它的计算结果为 0 /std:c++17

#if __cplusplus >= 201103
Run Code Online (Sandbox Code Playgroud)

我在 Windows 11 上的 Microsoft Visual Studio Community 2022(64 位)中看到了这一点。

visual-c++

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