小编ein*_*ica的帖子

条件表达式总是在C中评估为0或1吗?

条件表达式,例如涉及&&||的表达式 ,他们总是评价为0或1吗?或者对于真实情况,1以外的数字是可能的吗?我问,因为我想分配一个像这样的变量.

int a = cond1 && cond2;
Run Code Online (Sandbox Code Playgroud)

我想知道我是否应该做以下事情.

int a = (cond1 && cond2)? 1:0;
Run Code Online (Sandbox Code Playgroud)

c logical-operators semantics

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

如何将cudaStreamAddCallback()与类成员方法一起使用?

我正在尝试使用cudaStreamAddCallback()来同步我的cuda例程,但是我无法实现它,因为文档不是明确的.cuda-C-programming-guide说回调必须定义为:

void CUDART_CB MyCallback(void *data){}
Run Code Online (Sandbox Code Playgroud)

并且正在谈论需要设置的cudaStreamCallbackBlocking之类的标志; 而Cuda_Toolhit_Reference_Manual和cuda_runtime_api.h需要另一个回调实现:

void CUDART_CB MyCallback (cudaStream_t stream, cudaError_t status, void *userData){}
Run Code Online (Sandbox Code Playgroud)

并提到该标志是供将来使用,并要求0作为参数.此外,调用函数如下:

cudaStreamAddCallback(GpuStream, MyCallback, &BufSwitchParams, 0);
Run Code Online (Sandbox Code Playgroud)

并使用VS 2010尝试编译64位我得到消息:类型为"void(__ stdcall CMyClass ::*)(cudaStream_t stream,cudaError_t status,void*userData)"的参数与"cudaStreamCallback_t"类型的参数不兼容.

有人已经实现了这个功能,并且可以帮助我摆脱困境,同时在这里发布一个片段吗?

cuda visual-c++

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

为什么这两个列表迭代器的行为有所不同?

我正在练习列表迭代然后我卡住了.我的问题是,为什么这两种方法会产生不同的结果.

第一个代码打印出无限循环.第二个,打印出索引中的下一个String.

我是java新手,这也是我的第一语言.

public static void main(String[] args) {


    String[] hi = {"yo", "wat", "sup"};
    List<String> l1 = new ArrayList(Arrays.asList(hi));

    while (l1.iterator().hasNext()) {


        System.out.println(l1.iterator().next());
        ;
    }
   }
Run Code Online (Sandbox Code Playgroud)

VS

public static void main(String[] args) {


    String[] hi = {"yo", "wat", "sup"};
    List<String> l1 = new ArrayList(Arrays.asList(hi));

    Iterator<String> rator = l1.iterator();

    while (rator.hasNext()) {
      System.out.println(rator.next());
    }
}
Run Code Online (Sandbox Code Playgroud)

java iteration list

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

我什么时候应该使用 gcc 的 -Ofast 优化级别?

在 xcode 5 中,优化级别引入了一个名为-Ofast(最快、积极优化)的新级别。我应该何时以及如何使用这个级别?

optimization gcc fast-math

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

避免运行时编译时数字参数转换的代码重复

假设我们有诸如此类的功能

template <typename T, unsigned N> void foo();
Run Code Online (Sandbox Code Playgroud)

为简单起见,假设我们知道只有(常量)值N_1,N_2...... N_k有效N.

现在,假设我想将编译时参数设置为运行时参数,使用foo()黑盒,即实现:

template <typename T> void foo(unsigned n);
Run Code Online (Sandbox Code Playgroud)

通过foo<,>()打电话.我应该怎么做呢?显然,我可以写:

template <typename T> void foo(unsigned n) {
    switch(n) {
    case N_1 :  foo<T, N_1>(); break;
    case N_2 :  foo<T, N_2>(); break;
    // etc. etc.
    case N_k :  foo<T, N_k>(); break;
    }
 }
Run Code Online (Sandbox Code Playgroud)

......但这让我感到很脏.我想,我可以使用MAP()元宏来生成这些k行; 但我可以做更好的事情,而不是那么做宏观的事情吗?是否有可能编写类似上面的通用,并适用于每个可变参数模板和固定值的常量值?

笔记:

  • C++ 11/14/17特定的建议显然是受欢迎的.
  • N不一定是连续的,也不是小的,也不是排序的.例如,假设N_2 = 123456789且N_5 = 1.

c++ templates idiomatic template-specialization template-meta-programming

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

表示在任意枚举类型范围内的均匀分布

我在很多地方使用C++随机数实用程序库.它可能不是很舒服(例如,没有任意分布的基类),但是 - 我已经学会了忍受它.

现在我碰巧需要从枚举类型中统一采样值.我知道,关于SO的问题已经存在:

生成随机枚举

然而,那一个:

  1. 假设所有枚举值都是连续的,即它不起作用

    enum Color { Red = 1, Green = 2, Blue = 4 }
    
    Run Code Online (Sandbox Code Playgroud)

    我们希望以1/3的概率对这三个值中的每一个进行采样.

  2. 不提供功能std::uniform_distribution<>,即它不能与您传递它的随机引擎一起使用等等.

显然我不能使用std::uniform_int_distribution<Color>,如果只是因为上面的原因1.我该怎么做呢?

笔记:

  • 代码必须是通用的,即枚举类型将是模板参数.
  • 因为我可能需要一些仪器而不仅仅是粗糙的枚举,你可能会认为我拥有它; 只是明确陈述你的假设.
  • 具体来说,如果它有所帮助,假设我使用了 更好的Enums,让我充满了所有的花里胡哨.
  • 如果某种惯用的方式不做任何这样的仪器,那将会有一个很好的答案,但我对此表示怀疑.
  • 仅C++ 11/14解决方案是可以接受的.
  • 具有相同值的多个枚举标识符不会使频率加倍,它们只是彼此的别名.如果你有一个简单的解决方案,假设这些不存在,这也是相关的,虽然不是最理想的.

c++ random enums c++11 uniform-distribution

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

clang vs gcc在x86_64上复制3个字节 - mov的数量

应该优化编译代码,从一个地方到另一个地方复制3个字节,比如使用memcpy(,,3)看起来像汇编指令?

考虑以下程序:

#include <string.h>
int main() {
  int* p = (int*) 0x10;
  int x = 0;
  memcpy(&x, p, 4);
  x = x * (x > 1 ? 2 : 3);
  memcpy(p, &x, 4);  
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

它有点人为,会导致分段违规,但我需要这些指令,以便编译-O3不会使所有这些都消失.当我编译它(GodBolt,GCC 6.3 -O3)时,我得到:

main:
        mov     edx, DWORD PTR ds:16
        xor     eax, eax
        cmp     edx, 1
        setle   al
        add     eax, 2
        imul    eax, edx
        mov     DWORD PTR ds:16, eax
        xor     eax, eax
        ret
Run Code Online (Sandbox Code Playgroud)

great - mov从内存到寄存器的单个DWORD(= 4个字节).很好,优化.现在让我们改变memcpy(&x, …

assembly gcc clang memcpy compiler-optimization

5
推荐指数
2
解决办法
378
查看次数

如何在C++中可移植地获取进程ID?

在标准 C++ 中,我们可以获得当前执行线程的 id:std::this_thread::get_id(). 但是在撰写本文时,该语言并没有固有的过程概念。不过,我仍然想要我的进程 ID。

那么 - 在现代 C++ 中获取正在运行的进程 ID 的最便携、标准友好(尽管不是语言标准)的方法是什么?

笔记:

  • 我意识到有些机器没有进程,但是,它们也不一定有线程......所以没有理由不存在具有退化情况回退的跨平台功能。
  • 至少对于符合 POSIX 的操作系统和 Windows,我需要一个实际的进程 ID。

c++ portability pid

5
推荐指数
2
解决办法
2004
查看次数

如何获取当前的 spdlog 级别?

我需要在某些代码之前关闭 spdlog 级别,然后将其返回到之前的值。

如何在关闭之前获得当前级别?

c++ logging spdlog log-level

5
推荐指数
2
解决办法
3707
查看次数

为什么我不能将std :: unique_ptr用作"template <class> class"参数?

这段代码:

#include <memory>

template <template <typename> class Ptr>
class A { Ptr<int> ints; };

using B = A<std::unique_ptr>;
Run Code Online (Sandbox Code Playgroud)

产生以下错误(使用GCC 6.3):

a.cpp:6:28: error: type/value mismatch at argument 1 in template parameter list for ‘template<template<class> class Ptr> class A’
 using B = A<std::unique_ptr>;
                            ^
a.cpp:6:28: note:   expected a template of type ‘template<class> class Ptr’, got ‘template<class _Tp, class _Dp> class std::unique_ptr’
Run Code Online (Sandbox Code Playgroud)

现在,我可以解决这个问题,就像这样:

template <typename T>
using plugged_unique_ptr = std::unique_ptr<T>;
using B = A<plugged_unique_ptr>;
Run Code Online (Sandbox Code Playgroud)

但为什么我要这样做?我的意思是,为什么编译器不愿意"插入"第二个模板参数std::unique_ptr及其默认值并允许std::unique_ptr用作模板参数A

c++ unique-ptr template-templates c++11 template-argument-deduction

5
推荐指数
2
解决办法
642
查看次数