小编Pix*_*ist的帖子

1D或2D阵列,什么更快?

我需要表示一个2D场(轴x,y),我遇到一个问题:我应该使用一维数组还是二维数组?

我可以想象,重新计算1D数组的索引(y + x*n)可能比使用2D数组(x,y)慢,但我可以想象1D可能在CPU缓存中.

我做了一些谷歌搜索,但只找到关于静态数组的页面(并说明1D和2D基本相同).但我的阵列必须是动态的.

有啥

  1. 快点,
  2. 较小的(RAM)

动态1D阵列还是动态2D阵列?

谢谢 :)

c c++ arrays

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

高效布局和减少虚拟2d数据(摘要)

我使用C++和CUDA/C并且想要为特定问题编写代码,我遇到了一个相当棘手的减少问题.

我在并行编程方面的经验不容忽视,但非常有限,我不能完全预见到这个问题的特殊性.我怀疑有一种方便甚至"简单"的方式来处理我所面临的问题,但也许我错了.如果有任何资源(即文章,书籍,网络链接......)或关键词覆盖此类或类似问题,请告诉我.

我试图尽可能地概括整个案例并保持抽象而不是发布太多代码.

布局 ...

我有一个N初始元素和N个结果元素的系统.(例如,我将使用N = 8,但N可以是大于3的任何整数值.)

static size_t const N = 8;
double init_values[N], result[N];
Run Code Online (Sandbox Code Playgroud)

我需要计算初始值的几乎所有(不是所有我害怕的)唯一置换而没有自干扰.

这意味着计算f(init_values[0],init_values[1]),f(init_values[0],init_values[2]),... f(init_values[0],init_values[N-1]),f(init_values[1],init_values[2])...,f(init_values[1],init_values[N-1])...等等.

这实际上是一个虚拟的三角形矩阵,其形状如下图所示.

 P     0    1    2    3    4    5    6    7
   |---------------------------------------
  0|   x 
   |
  1|   0    x
   |
  2|   1    2    x 
   |
  3|   3    4    5    x
   |
  4|   6    7    8    9    x
   |
  5|  10   11   12   13   14    x
   |
  6|  15   16   17   18   19   20 …
Run Code Online (Sandbox Code Playgroud)

c c++ cuda

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

是否有技术原因不允许使用声明来使用不同的名称访问函数名称?

考虑

namespace foo
{
  namespace bar
  {
    void f();
    void f(int);
  }
}
Run Code Online (Sandbox Code Playgroud)

foo一个可以使所有foo::bar::f可访问为foo::fvia

using bar::f; // in foo
Run Code Online (Sandbox Code Playgroud)

是否有任何技术原因,语法的不存在性,使所有foo::bar::f可访问foo::g

using bar::f as g; 
// or in line with using declarations for types:
using g = bar::f;
Run Code Online (Sandbox Code Playgroud)

或者有这样的事情甚至被考虑但被拒绝了?(为什么?)

c++ language-lawyer

16
推荐指数
2
解决办法
1105
查看次数

如何在类本身中使用类名作为模板参数?

我有一个有两个模板参数的模板类

template <class T, class U> class A  /* ... */
Run Code Online (Sandbox Code Playgroud)

和另一个模板类,它接受一个带有两个参数作为模板参数的模板类.

template <class T, class U, template<class X, class Y> class Z>
class B
{
    typedef typename Z<T,U>::pointer pointer;
};
Run Code Online (Sandbox Code Playgroud)

是否无法在A中创建B的实例,其中Z是A?

template <class T, class U>
class A  
{
public:
  B<T,U,A> foo (void) // compiler complaining here
  {
    B<T,U,A> test; // and here
    return test;
  }
};
Run Code Online (Sandbox Code Playgroud)

执行相同操作的自由函数根本不存在问题.

template<class T, class U>
B<T, U, A> bar (void)
{
    B<T,U,A> test;
    return test;
}
Run Code Online (Sandbox Code Playgroud)

换句话说:是否有任何规则我没有倒下来阻止我使用我所在类的名称作为模板参数?


代码是:

template <class T, class …
Run Code Online (Sandbox Code Playgroud)

c++ templates

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

为什么 std::Optional 不允许“仅移动构造和复制分配”类型的移动分配?

该标准要求移动赋值运算符optional...

constexpr optional& operator=( optional&& other )
Run Code Online (Sandbox Code Playgroud)

[...] 不得参与重载决策,除非 is_move_constructible_v<T>为真并且is_move_assignable_v<T>为真。

可选值的分配lhs = rhs;可以执行以下任一操作:

  • 摧毁lhs(如果bool(lhs) && !bool(rhs)
  • lhs( rhsif !bool(lhs) && bool(rhs)) 或
  • 分配rhslhs(如果bool(lhs) && bool(rhs))。

因此,可以选择为 的移动分配设置两组先决条件optional

  1. is_move_constructible_v<T> && is_move_assignable_v<T>
  2. is_move_constructible_v<T> && is_copy_assignable_v<T>

其中第二种形式可以使用复制赋值 if ,bool(lhs) && bool(rhs)但移动构造 if !bool(lhs) && bool(rhs)

对于以下两类类型,我认为当前的先决条件集存在一个不可否认的相当人为的问题:

  1. 不可移动赋值但可复制赋值、可移动构造和可复制构造的类型不能从赋值时的移动构造中受益,即使构造是赋值操作的一部分。将选择复制赋值运算optional符并复制构造或复制赋值。

  2. 既不可复制构造也不可移动分配但可移动构造且可复制分配的类型根本无法分配。

在标准化过程中是否已经考虑过这一点,optional或者是否有任何理由说明为什么没有考虑或已放弃这一点?

(免责声明:我知道如果is_move_assignable为真,则通常is_copy_assignable …

c++ move-semantics c++17 stdoptional

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

为什么通过CreateProcess调用的程序窗口会显示SW_HIDE和CREATE_NO_WINDOW?

我尝试从我的exe调用另一个程序,我希望它在后台静默执行.(由于此调用经常发生,因此不能接受弹出窗口.)

可能这样做是这样的:

STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
ZeroMemory( &pi, sizeof(pi) );
if (!CreateProcess(NULL, cl, NULL, NULL, FALSE, 
                   CREATE_NO_WINDOW, NULL, NULL, &si, &pi)) return -1;
else
{
  WaitForSingleObject( pi.hProcess, INFINITE );
  CloseHandle( pi.hProcess );
  CloseHandle( pi.hThread );
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

在创建过程和所需的程序运行,但不幸的是,窗口尽管显示了CREATE_NO_WINDOWSW_HIDE标志.我错过了什么/做错了吗?

我发现我可能会去

  1. 从进程句柄中获取进程ID GetProcessId
  2. 使用EnumWindowsGetWindowThreadProcessId查找匹配窗口
  3. 使用所获得的HWND调用ShowWindowSW_HIDE

但这很麻烦,我认为SW_HIDE无论如何应该在创建过程时"开箱即用".

c++ winapi visual-c++

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

*在C++中的目的是什么?

int main()
{
    string s("some string");
    if (s.begin() != s.end())
        auto it = s.begin();
    *it = toupper (*it) ; // Error ; the identifier "it" is undefined 
}
Run Code Online (Sandbox Code Playgroud)

为什么*它未定义?为什么我们需要在迭代器维度中使用dereference?

c++ iterator dereference

-11
推荐指数
1
解决办法
117
查看次数