请参阅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类型是什么?
追问: 我问一个后续问题这里是密切相关的这一个.
有没有人尝试在Lazy C++源文件中嵌入Doxygen评论?任何问题?生成头文件/源文件后,Doxygen注释在哪里?
我已经开始使用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仅适用于有序池,并且释放内存的速度很慢,因为它仅释放没有分配的内存块。
我敢肯定,清除会更快。
所以假设我有一个像这样的课程:
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中读到第三个参数是比较一些东西,但我不明白那是什么东西.任何人都能解释一下吗?
我不想对Apple的LLDB调试器进行beta测试.如何让XCode停止唠叨我升级调试器?每次我建立这个警告惊叹号都是相当恼人的.
我正在使用高速公路运行websocket服务器来补充我的Django应用程序.有时,我需要将消息从Django发送到websocket服务器,使用websocket-client模块可以正常工作.我很乐意使用WAMP协议,因为RPC/PubSub API看起来很棒,但python客户端代码是作为一个扭曲的协议实现的,我无法弄清楚如何使用它,即函数调用,而不是来自一些外国事件循环.有什么我在文档中没有看到的,或者我的架构应该有所不同?
是否有计划添加在当前语言环境下不变的 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)
这些函数预处理它的输入,以便它可以独立于当前语言环境使用,在假设下
setlocale在这些修复函数和对任何受影响函数的调用之间没有调用(1) 意味着预处理方法在异国语言环境中中断(参见https://en.wikipedia.org/wiki/Decimal_mark#Hindu.E2.80.93Arabic_numeral_system示例)。(2) …
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"被解释为负零有符号整数的可能性。
注意:我已经知道负零浮点数。
考虑以下:
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将保持不变吗?我倾向于认为"是",但我想确保标准允许这样的使用.