小编Lor*_*ins的帖子

变量模板是否在标头中声明,是否违反 ODR?

当头文件包含如下所示的模板变量时会发生什么:

template <class T>
std::map<T, std::string> errorCodes = /* some initialization logic */;
Run Code Online (Sandbox Code Playgroud)

这个变量使用安全吗?对此进行了一些研究,我发现:

  1. 模板是隐式外部的,但这确实会导致 ODR 违规
  2. 没有任何 static 或 inilne 或 constexpr 装饰,我最终可以得到多个定义
  3. C++17 的关键字inline改变了规则,但 c++20 有不同的行为(?)

那么是哪一个呢?

c++ templates c++17 c++20

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

strstream可以直接使用标准字符串的缓冲区吗

鉴于strstream有以下构造函数:

strstream( char* s, int n, std::ios_base::openmode mode);
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以直接在“只读”模式下使用标准字符串底层的缓冲区,以避免缓冲区重新分配产生奇怪的副作用:

std::string buffer("Dummy Data");
std::strstream ss(
  const_cast<char *>(buffer.data()), buffer.length(), std::ios_base::in);

std::string other;
ss >> other;
std::cout << other << std::endl;
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,上面的代码最终生成了other一个空字符串。在文档中有一个示例,其中C 数组用作 的静态缓冲区strstream,所以我想知道它不能使用缓冲区内容的原因是什么std::string

注意:我无法使用,std::stringstream因为相关平台的 VS 实现仅限于 4GB 大小,如此处所述


更新:

我发现使用std::ios_base::app(如示例中所示)几乎可以使我的代码正常工作。现在最大的问题(根据我收到的评论)是它strstream已被长期弃用。也许boost iostreams中有一些东西可以提供帮助,但我不太了解该库。

c++ stringstream c++11

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

是否存在标准库实现,其中high_resolution_clock不是typedef?

C++草案参数20.12.7.3内容如下:

high_resolution_clock可能是system_clock或的同义词steady_clock

当然,这可能只是强制要求,但我想知道:

  • 对于high_resolution_clocktypedef的其他东西有什么意义吗?
  • 有这样的实现吗?
  • 如果设计一个具有较短滴答周期的时钟,它可以是稳定的或不稳定的.因此,如果存在这样的机制,我们是否不想"改进" system_clock,high_resolution_clock并且typedef再次违反解决方案?

c++ c++-chrono

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

为什么不总是使用std :: forward?

std::move和之间的区别std::forward是众所周知的,我们使用后者来保留转发对象的值类别,并使用前者转换为右值引用以启用移动语义.

有效的现代C++中,存在一种指导原则

std::move在rvalue引用std::forward上使用,在通用引用上.

但在以下场景中(以及我们不想更改值类别的场景),

template <class T>
void f(vector<T>&& a)
{
    some_func(std::move(a)); 
}
Run Code Online (Sandbox Code Playgroud)

哪里a不是转发引用而是简单的右值引用,执行以下操作不是完全相同的吗?

template <class T>
void f(vector<T>&& a)
{
    some_func(std::forward<decltype(a)>(a)); 
}
Run Code Online (Sandbox Code Playgroud)

因为这可以很容易地封装在像这样的宏中,

#define FWD(arg) std::forward<decltype(arg)>(arg)
Run Code Online (Sandbox Code Playgroud)

如此总是使用这个宏定义不方便吗?

void f(vector<T>&& a)
{
    some_func(FWD(a)); 
}
Run Code Online (Sandbox Code Playgroud)

写这两种方式不完全相同吗?

c++ c++11

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

可以不在放置新分配的对象上调用析构函数吗?

说我有一个固定的内存缓冲区

char *buffer; 
Run Code Online (Sandbox Code Playgroud)

使用placement new在缓冲区中分配我的结构

struct S
{ 
    std::tuple<int, double, char> m_data; 
    auto getRecord() 
    { 
        return m_data;
    }
};

S *newS = new(buffer + offset)S; 
Run Code Online (Sandbox Code Playgroud)

我知道我应该手动调用这些已分配项目的析构函数,但是如果没有涉及bookeeping /资源管理,是否可以省略它?换句话说,如果使用缓冲区的类的析构函数没有执行任何操作(类似于~S()上面的内容),是否可以跳过此步骤?如果是这种情况,我可以重用缓冲区而不破坏以前的租户吗?

c++

7
推荐指数
2
解决办法
370
查看次数

元组实现是否有优化的布局?

在读这篇文章时,我惊讶于某个程度的元编程可以为你的班级布局做些什么.我必须承认,如果我不得不陈述我的理解,我不会完全掌握建议的最佳布局是什么:

通过降序排列来排序类成员,即具有最大alignof结果的类型首先等

如果我弄错了,请随意纠正我(如果你有一个简短的解释为什么会发生这种情况会更好,我无法在我的问题中复制粘贴大部分理由),但我的问题是关于另一个话题:

任何库实现std::tuple都有这样的布局优化吗?

如果没有,是否有任何标准的代数数据类型,除了编写这样的机器之外,还有另一种方法可以为我的班级做这个吗?

c++ tuples memory-alignment c++11

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

这个回报声明中发生了什么?

我正在阅读复制文章(以及它应该如何在C++ 17中得到保证),这让我有点困惑(我不确定我知道我以前认识的事情).所以这是一个最小的测试用例:

std::string nameof(int param)
{
    switch (param)
    {
    case 1: 
        return "1"; // A
    case 2: 
        return "2" // B
    }
    return std::string(); // C
}
Run Code Online (Sandbox Code Playgroud)

我看到它的方式,情况A和B对返回值执行直接构造,因此复制省略在这里没有意义,而案例C不能执行复制省略,因为有多个返回路径.这些假设是否正确

另外,我想知道是否

  • 有写了上一个更好的方法(例如有一个std::string retval;总是返回一个或写入的情况下A,并B作为return string("1")等)
  • 有任何移动发生,例如"1"是暂时的,但我假设它被用作构造函数的参数std::string
  • 我有一个优化问题(例如我认为C可以写成return{},这会是一个更好的选择吗?)

c++ stl

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

如何优化Python中的黑盒函数?

我有一个要优化的函数,我无法从中得到导数或 Hessian 或 Jacobian(因此标题中的“黑匣子”)。假设我的函数如下所示:

def my_fun(some_int, some_other_int, some_string):
    return float(some_int + some_other_int + len(some_string))
Run Code Online (Sandbox Code Playgroud)

请注意,我仅执行强制转换以表明该函数返回浮点数。

搜索空间/约束/边界(或者无论您如何称呼它)将是:

some_int = [1..10] # int interval
some_other_int = [1, 2, 3] # int discrete
some_string = ["methodA", "methodB", "methodC"] #discrete
Run Code Online (Sandbox Code Playgroud)

我应该如何用Python表达这个问题?这是我迄今为止搜索过的内容:

  • Scipy优化器似乎不接受适用于我的情况的 Nelder-Mead Simplex(或 Powell 方法)的约束
  • PyOpt ...好吧,我无法使用多元目标函数
  • 还有Pyswarm。有谁知道如何在 Pyswarm 中做到这一点?

有什么想法吗?

python mathematical-optimization scipy

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

任务流是否适合构建并行管道?

我一直在寻找到任务流对用户友好的API来构建并行C ++程序。尽管功能强大,但我找不到使用此框架构建并行管道的示例。

为了消除歧义,Parallel and Distributed Programming Using C++一书将管道thead模型定义为:

一种分阶段处理输入流的流水线方法。每个阶段都是一个线程,在输入单元上执行工作。当输入单元经过所有阶段后,则输入的处理完成。

任务流可以做到这一点吗?如果是,如何,如果不是,是否有其他选择?

c++ api multithreading

6
推荐指数
0
解决办法
125
查看次数

uWebSockets 客户端

我主要使用 C++,想要为项目实现服务器-客户端通信。虽然不太精通分布式计算,但我尝试过各种工具组合,例如 SocketIO 服务器(JS 中)+ C++ 客户端库或 IXWebSocket。我也不想在 Boost.Asio 中从头开始实现所有内容。

据我所知,uWebSockets是 C++ 中性能最高且符合标准的解决方案。问题是只有一个服务器库可用。我知道“任何”兼容的 Web 套接字实现都能够与 uWebSockets 服务器一起使用,但是:

  • 有规范的方法吗?在这种情况下,人们作为客户端使用什么?我看到该仓库有大约 12k 颗星,所以这一定非常简单。我再次想使用C++ 客户端,而不是 JS 中的浏览器实现。
  • 如果定制解决方案合适,我应该如何去做?

c++ client-server uwebsockets

6
推荐指数
0
解决办法
1892
查看次数