小编kiz*_*zx2的帖子

为什么C++ 11的lambda默认需要"可变"关键字用于按值捕获?

简短的例子:

#include <iostream>

int main()
{
    int n;
    [&](){n = 10;}();             // OK
    [=]() mutable {n = 20;}();    // OK
    // [=](){n = 10;}();          // Error: a by-value capture cannot be modified in a non-mutable lambda
    std::cout << n << "\n";       // "10"
}
Run Code Online (Sandbox Code Playgroud)

问题:为什么我们需要mutable关键字?它与传统参数传递给命名函数有很大不同.背后的理由是什么?

我的印象是,按值捕获的整个点是允许用户更改临时值 - 否则我几乎总是更好地使用按引用捕获,不是吗?

有什么启示吗?

(顺便说一句,我使用的是MSVC2010.这应该是标准的AFAIK)

c++ lambda c++11

249
推荐指数
11
解决办法
6万
查看次数

std :: vector比普通数组慢得多吗?

我一直认为这std::vector是"作为阵列实施的一般智慧",等等等等等等.今天我去了测试它,似乎不是这样:

这是一些测试结果:

UseArray completed in 2.619 seconds
UseVector completed in 9.284 seconds
UseVectorPushBack completed in 14.669 seconds
The whole thing completed in 26.591 seconds
Run Code Online (Sandbox Code Playgroud)

这大约慢了3-4倍!没有真正证明" vector可能会慢几纳米"的评论.

我使用的代码:

#include <cstdlib>
#include <vector>

#include <iostream>
#include <string>

#include <boost/date_time/posix_time/ptime.hpp>
#include <boost/date_time/microsec_time_clock.hpp>

class TestTimer
{
    public:
        TestTimer(const std::string & name) : name(name),
            start(boost::date_time::microsec_clock<boost::posix_time::ptime>::local_time())
        {
        }

        ~TestTimer()
        {
            using namespace std;
            using namespace boost;

            posix_time::ptime now(date_time::microsec_clock<posix_time::ptime>::local_time());
            posix_time::time_duration d = now - start;

            cout << name << " completed in " << …
Run Code Online (Sandbox Code Playgroud)

c++ arrays performance stl vector

203
推荐指数
7
解决办法
8万
查看次数

在Objective-C中测试nil - if(x!= nil)vs if(x)

我在网上找到的大多数例子都写道:

if(x != nil)
    // ...
Run Code Online (Sandbox Code Playgroud)

这有什么问题吗?

if(x)
    // ...
Run Code Online (Sandbox Code Playgroud)

我在一个简单的程序中尝试了两个,但没有找到任何区别.

syntax objective-c

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

PHP中的值对象与关联数组

(这个问题使用PHP作为上下文,但不仅限于PHP.例如,任何内置哈希的语言也是相关的)

我们来看看这个例子(PHP):

function makeAFredUsingAssoc()
{
    return array(
        'id'=>1337,
        'height'=>137,
        'name'=>"Green Fred");
}
Run Code Online (Sandbox Code Playgroud)

与:

class Fred
{
    public $id;
    public $height;
    public $name;

    public function __construct($id, $height, $name)
    {
        $this->id = $id;
        $this->height = $height;
        $this->name = $name;
    }
}

function makeAFredUsingValueObject()
{
    return new Fred(1337, 137, "Green Fred");
}
Run Code Online (Sandbox Code Playgroud)

方法#1当然更简洁,但它可能很容易导致错误,例如

$myFred = makeAFredUsingAssoc();
return $myFred['naem']; // notice teh typo here
Run Code Online (Sandbox Code Playgroud)

当然,有人可能会争辩说$myFred->naem同样会导致错误,这是事实.然而,正式课程对我来说感觉更加僵硬,但我无法证明这一点.

使用每种方法的优点/缺点是什么?人们何时应该使用哪种方法?

php associative-array value-objects

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

警告C4996:此功能或变量可能不安全 - 与POSIX上的GCC相比

我注意到MS编译器给出了cstdlib类似函数的"弃用"警告getenv.MS已经发明了自己的标准,如_dupenv_s.

问题1

AFAIK主要的"不安全"的事情是关于重入*.由于MS的CRT被标记为"多线程"(/MT),为什么它们不能替换getenv为可重入,线程安全的版本?是否有人会依赖不安全的行为?

问题2

我用GCC编译了相同的代码,g++ -Wall -Wextra -Weff++ -pedantic foo.cpp并没有产生任何警告.所以我猜这不是POSIX的问题?这是怎么解决的?(好吧也许他们只是改变了行为getenv,很高兴得到这个确认).

*说它只是关于重入是一种过于概括的说法.当然,我们有类似的东西strncpy_s可以完全改变签名并处理缓冲区大小.但并没有改变这个问题的核心

c++ windows gcc visual-c++

20
推荐指数
3
解决办法
1万
查看次数

Unicode字符串的跨平台迭代(使用ICU计算字母)

我想迭代Unicode字符串的每个字符,处理每个代理对并将字符序列组合为一个单元(一个字形).

文本"नमस्ते"由代码点组成:U+0928, U+092E, U+0938, U+094D, U+0924, U+0947其中,U+0938并且U+0947组合标记.

static void Main(string[] args)
{
    const string s = "??????";

    Console.WriteLine(s.Length); // Ouptuts "6"

    var l = 0;
    var e = System.Globalization.StringInfo.GetTextElementEnumerator(s);
    while(e.MoveNext()) l++;
    Console.WriteLine(l); // Outputs "4"
}
Run Code Online (Sandbox Code Playgroud)

所以我们在.NET中有它.我们也有Win32的CharNextW()

#include <Windows.h>
#include <iostream>
#include <string>

int main()
{
    const wchar_t * s = L"??????";

    std::cout << std::wstring(s).length() << std::endl; // Gives "6"

    int l = 0;
    while(CharNextW(s) != …
Run Code Online (Sandbox Code Playgroud)

c++ unicode cross-platform icu

20
推荐指数
1
解决办法
3992
查看次数

功能点分析 - 一种严重过高的技术?

赏金澄清

我知道这是一个主观问题.我正在寻找的理想答案可以解释为什么这里引用的场景会如此令人惊讶.

如果您认为所引用的场景确实并不令人意外并且可以预期,请分解步骤以证明这样一个小应用程序如何能够花费一个月和数千美元的开发.我做了很多计算(例如,查找最低工资),所以我希望理想的答案能够做到.

如果您认为引用的情况确实被高估了,请准确指出您的理由.在他的计算中你会发现哪些错误导致像这样的简单应用程序的巨大成本?你会怎么做得与众不同?(不需要写整个过程,但细节而不是一般化的感觉会很好)


我之前已经多次询问有关FPA的问题,但这次我对它采取了更具分析性的观点,并备份了数据.

1.首先,一些数据

这个问题是基于一个教程.他有一个"抽样计数"部分,他一步一步地展示了它.您可以在此处查看其示例应用程序的一些屏幕截图.

最后,他计算出的未调整FP99.

还有另一篇关于InformIT的文章,其中包含典型小时/ FP的行业数据.它的范围从2小时/ FP到27.4小时/ FP.让我们2暂时坚持下去(因为SO读者可能是更有效率的人群:p).

2.现实检查!?

现在再次查看屏幕截图.

在这里做一点数学

99 * 2 = 198 hours
198 hours / 40 hours per week = 5 weeks
Run Code Online (Sandbox Code Playgroud)

真的吗?该示例应用程序需要5周才能实现?是不是只有我的感觉才能让任何体面的程序员超过一周(我甚至不说周末)才能完成它?

现在让我们尝试估算项目的成本.我们现在将使用纽约的最低工资(维基百科),即7.25美元

198 * 7.25 = $1435.5
Run Code Online (Sandbox Code Playgroud)

从我从屏幕截图中看到的,这个应用程序是一个小的excel改进应用程序.我本可以以200美元购买MS Office Pro,这为我提供了更强的互操作性(.xls文件)和灵活性(电子表格).

(为了记录,同一个网站还有另一篇讨论生产力的文章.看起来他们通常使用4.2小时/ FP,这给我们带来了更令人震惊的统计数据:

99 * 4.2 = 415 hours = 10 weeks = almost 3 whopping …
Run Code Online (Sandbox Code Playgroud)

project-management function-points

17
推荐指数
2
解决办法
6821
查看次数

了解Android"无线电状态机"以获得更好的电池寿命

在Android文档页面优化下载以实现高效网络访问,要点是"唤醒收音机不好","批量转移"或"背负GCM".那篇文章为好奇留下了一些内在的工作原则:

  1. 它说:"每次创建新的网络连接时,无线电都会转换为全功率状态." 什么是连接这里的意思?那是TCP连接吗?这是否意味着发送UDP数据包不会唤醒无线电?

  2. Standby中它说:"待机:最小能量状态,在此期间没有网络连接是活动的或需要的." 这是否意味着网络模块完全关闭?如果是这样,即使设备处于睡眠模式,GCM如何工作?如果没有,与全功率模式相比,大致使用多少电池?

  3. "每次创建新的网络连接时,无线电都会转换为全功率状态." 这与长期存在的TCP连接有何关系?如果我创建TCP连接然后只是继续接收数据包,那么我将不会创建新的网络连接或发送任何数据.这是否允许网络模块进入待机模式?

  4. iPhone的工作方式几乎一样吗?

mobile networking android battery electronics

15
推荐指数
1
解决办法
4535
查看次数

Xcode中的Vi键

我很惊讶没有人问这个.在Xcode中获得Vi体验的最佳方式(如果有的话)是什么?我知道ViMate,但TextMate在集成和代码完成方面并不接近Xcode.

顺便说一下,我正在使用Xcode 4.

vi macos xcode plugins

13
推荐指数
2
解决办法
5383
查看次数

在自动更新期间保持应用GCM注册ID有效

在官方文档和此问题中,Google建议重新注册GCM,因为注册ID可能会更改.

可能发生的一种假设方式是,在更新期间,全部是卸载然后安装.如果在该间隙期间收到GCM通知,则NotRegistered可以返回该GCM通知,并且GCM注册ID可能无效.

如果Google Play自动更新我的应用,那么处理这种情况并重新注册的最强大的方法是什么?在像WhatsApp这样的应用中,除非收到GCM通知,否则用户可能永远不会明确启动任何活动.因此,用户基本上"迷失",直到他意外地偶然发现了一项活动.

/sf/answers/1046871591/中,提到将包含"Canonical ID",以便第三方服务器可以更新注册ID.但是在文档中没有明确说明这种情况被覆盖(即GCM可能会在更新间隙中将应用程序误认为"已卸载",在这种情况下,在我看来,不会生成规范ID,而且我会直奔NotRegistered).

像WhatsApp或其他消息应用程序这样的"高可用性"应用程序如何处理这个问题?

android auto-update push-notification google-cloud-messaging

13
推荐指数
2
解决办法
1349
查看次数