小编Emi*_*ier的帖子

好的,为C++中的无行为聚合(bundle-o-data)提供构造函数?

请参阅C++编码标准的规则#41 或Sutter的Gotw#70,其中指出:

使数据成员保密,除了无行为聚合(C样式结构).

为了方便起见,我经常想为这些C风格的结构添加一个简单的构造函数.例如:

struct Position
{
    Position(double lat=0.0, double lon=0.0) : latitude(lat), longitude(lon) {}
    double latitude;
    double longitude;
};

void travelTo(Position pos) {...}

main()
{
    travelTo(Position(12.34, 56.78));
}
Run Code Online (Sandbox Code Playgroud)

虽然可以更容易地动态构造Position,但构造函数也可以为我初始化默认的Position对象.

也许我可以关注std :: pair的例子并提供一个"makePosition"免费功能?NRVO应该和构造函数一样快,对吧?

Position makePosition(double lat, double lon)
{
    Position p;
    p.latitude = lat;
    p.longitude = lon;
    return p;
}

travelTo(makePosition(12.34, 56.78));
Run Code Online (Sandbox Code Playgroud)

通过添加那个可怜的小构造函数,我是否违背了"无行为聚合"概念的精神?

编辑:

是的,我知道Position p={12.34, 56.78}.但我不能travelTo({12.34, 56.78})用纯C结构.

编辑2:

对于那些对POD类型感兴趣的人:C++中的POD类型是什么?

追问: 我问一个后续问题这里是密切相关的这一个.

c++

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

Lazy C++(lzz)对Doxygen有用吗?

有没有人尝试在Lazy C++源文件中嵌入Doxygen评论?任何问题?生成头文件/源文件后,Doxygen注释在哪里?

c++ lazy-c++ doxygen

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

提高POOL使用率-单身人士

我已经开始使用Boost池作为boost / pool / singleton_pool.hpp中定义的单例,因为我需要重复分配很多相同大小的结构。正如我之前使用malloc一样,性能得到了惊人的提高。

我分配的对象由生产者线程放入列表中,而使用者线程将这些对象移到另一端并释放对象。但是当我释放对象时,任务管理器中进程的内存使用量永远不会减少。我猜这是因为池库预先分配了一定数量的内存?

同样,当生产者的数据速率增加时,总内存使用量似乎以块为单位增加了约10k,但即使在调用池中的对象空闲后也从未减少。

我想定期做一些整理工作以释放内存块,以减少进程的整体内存使用量。这可能吗?我不能使用purge_memory,因为这将意味着我必须在农产品和消费者之间同步净化。顺便说一句,purge_memory是否释放了块,即减少了任务管理器中的内存使用量?

我在MS Windows中编程。

谢谢Niladri

PS-我尝试通过将池排序(ordered_malloc)来使用release_memory,但它始终返回false。

更新:

尚未尝试使用purge_memory,因为该池在两个线程之间共享。但是已经发现release_memory仅适用于有序池,并且释放内存的速度很慢,因为它仅释放没有分配的内存块。

我敢肯定,清除会更快。

c++ boost

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

带有类键和类值的C++ STL映射容器

所以假设我有一个像这样的课程:

class Point
{
   private:
      int x, y;
   public:
      void setX(int arg_x) { x = arg_x; }
      void sety(int arg_y) { y = arg_y; }
      int getX() const { return x; }
      int gety() const { return y; }
};
Run Code Online (Sandbox Code Playgroud)

现在我想要一张这样的地图:

map<Point, Point> m;
Run Code Online (Sandbox Code Playgroud)

但我需要第三个参数.我在cplusplus中读到第三个参数是比较一些东西,但我不明白那是什么东西.任何人都能解释一下吗?

c++ containers map

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

默认函数参数的有效表达式

函数或成员函数中的默认参数的所有可能类型的有效表达式是什么?

c++ c++-faq

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

我可以在XCode 4.3.2中禁用"从GDB升级调试器到LLDB"警告吗?

我不想对Apple的LLDB调试器进行beta测试.如何让XCode停止唠叨我升级调试器?每次我建立这个警告惊叹号都是相当恼人的.

iphone xcode ios xcode4 lldb

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

高速公路WAMP服务器的命令客户端?

我正在使用高速公路运行websocket服务器来补充我的Django应用程序.有时,我需要将消息从Django发送到websocket服务器,使用websocket-client模块可以正常工作.我很乐意使用WAMP协议,因为RPC/PubSub API看起来很棒,但python客户端代码是作为一个扭曲的协议实现的,我无法弄清楚如何使用它,即函数调用,而不是来自一些外国事件循环.有什么我在文档中没有看到的,或者我的架构应该有所不同?

python twisted autobahn wamp-protocol

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

使用 strtod strtof atof printf 进行区域设置不变的字符串处理?

是否有计划添加在当前语言环境下不变的 C 标准库字符串处理函数版本?

目前有很多脆弱的解决方法,例如,来自 jansson/strconv.c:

static void to_locale(strbuffer_t *strbuffer)
{
    const char *point;
    char *pos;

    point = localeconv()->decimal_point;
    if(*point == '.') {
        /* No conversion needed */
        return;
    }

    pos = strchr(strbuffer->value, '.');
    if(pos)
        *pos = *point;
}

static void from_locale(char *buffer)
{
    const char *point;
    char *pos;

    point = localeconv()->decimal_point;
    if(*point == '.') {
        /* No conversion needed */
        return;
    }

    pos = strchr(buffer, *point);
    if(pos)
        *pos = '.';
}
Run Code Online (Sandbox Code Playgroud)

这些函数预处理它的输入,以便它可以独立于当前语言环境使用,在假设下

  1. 分隔符是一个字节
  2. setlocale在这些修复函数和对任何受影响函数的调用之间没有调用
  3. 字符串可以在转换前修改

(1) 意味着预处理方法在异国语言环境中中断(参见https://en.wikipedia.org/wiki/Decimal_mark#Hindu.E2.80.93Arabic_numeral_system示例)。(2) …

c locale standard-library

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

C++11 标准是否保证零值有符号整数的一元减为零?

C++11 标准是否保证零值有符号整数的一元减为零?

例如:

int zero = 0;
int n = -zero;
int m = -0;
assert(memcmp(&n, &zero, sizeof(int)) == 0);
assert(memcmp(&m, &zero, sizeof(int)) == 0);
Run Code Online (Sandbox Code Playgroud)

我知道这一点-0并且0在二进制的恭维表示中是相同的,但我想知道标准是否允许有符号整数零的否定为其他表示的负零,例如一个人的恭维或有符号幅度。

我在 C++11 草案中所能找到的只是 §5.3.1,第 8 段:

一元运算符的操作数应具有算术或无作用域枚举类型,结果是其操作数的否定。积分提升是在积分或枚举操作数上执行的。无符号量的负数是通过从 2^n 中减去其值来计算的,其中 n 是提升操作数中的位数。结果的类型是提升操作数的类型。

我在草案中找不到否定的定义。

动机:我正在为一个库(最终可能是开源的)编写一个专门的整数解析器,我想知道我是否应该担心在不常见的架构上"-0"被解释为负零有符号整数的可能性。

注意:我已经知道负零浮点数。

c++ integer arithmetic-expressions unary-operator c++11

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

将空范围(相同的迭代器)传递给STL算法会导致定义的行为吗?

考虑以下:

std::vector<int> vec(1); // vector has one element
std::fill(vec.begin(), vec.begin(), 42);
std::fill(vec.begin()+1, vec.end(), 43);
std::fill(vec.end(), vec.end(), 44);
Run Code Online (Sandbox Code Playgroud)

std::fill上面的所有用法都会导致定义的行为吗?我保证vec将保持不变吗?我倾向于认为"是",但我想确保标准允许这样的使用.

c++ iterator stl

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