C ++ Wunused-variable с std :: uniqe_ptr [duplicate]

@ Гидеон - рад, что кто-то это указал. Вот простой тест, который показывает драматическое влияние AndAlso:

    Dim tm As New Stopwatch
    Const tries As Integer = 123456
    Dim z As Integer = 0
    Dim s() As String = New String() {"0", "one"}

    Debug.WriteLine("AndAlso")
    For x As Integer = 0 To s.Length - 1
        z = 0
        tm.Restart() 'restart the stopwatch
        For y As Integer = 0 To tries
            If s(x) = x.ToString AndAlso s(x) = y.ToString Then '<<<<<<<<<<
                z += 1
            End If
        Next
        tm.Stop()
        Debug.WriteLine(x.ToString.PadRight(3, " "c) & z.ToString.PadRight(10, " "c) & tm.Elapsed.ToString)
    Next

    Debug.WriteLine("And")
    For x As Integer = 0 To s.Length - 1
        z = 0
        tm.Restart() 'restart the stopwatch
        For y As Integer = 0 To tries
            If s(x) = x.ToString And s(x) = y.ToString Then '<<<<<<<<<<
                z += 1
            End If
        Next
        tm.Stop()
        Debug.WriteLine(x.ToString.PadRight(3, " "c) & z.ToString.PadRight(10, " "c) & tm.Elapsed.ToString)
    Next
20
задан Kylo 14 March 2011 в 19:36
поделиться

3 ответа

Это не примитивное значение, поэтому его конструктор и / или деструктор могут иметь желаемые побочные эффекты.

Чтобы проиллюстрировать это, это происходит на практике: я использую класс для временных разделов кода, который выглядит примерно так:

class Timed {
    double start;
    public:
        Timed() { start = now(); }
        ~Timed() { std::cout << (now() - start) << '\n'; }
}

Итак, чтобы измерить, сколько времени занимает функция, я просто делаю:

void slow() {
    Timed t;
    // heavy operation here...
}

Переменная t никогда не используется, но она по-прежнему важна к поведению кода.

30
ответ дан Thomas 20 August 2018 в 18:47
поделиться
  • 1
    +1 Для использования деструктора для вычисления конца времени. Прохладный трюк. – Thomas Matthews 14 March 2011 в 23:30
  • 2
    Он называется RIAA и был целью дизайна с момента создания C ++ (см. Bjarne Stroustrup) – sehe 15 March 2011 в 12:59
  • 3
    @sehe Вы, вероятно, намереваетесь RAII :-), не так ли? – Kylo 21 March 2011 в 11:52
  • 4
    @Kylo: Да, просто. Должно было выглядеть так – sehe 21 March 2011 в 21:08
  • 5
    Это напоминает мне отслеживание производительности :) github.com/easylogging/easyloggingpp#performance-tracking , который использует тот же механизм для отслеживания производительности функции / блоков (отказ от ответственности: я разработчик этой библиотеки) - woops просто заметил, что эта ветка довольно старая :) Да здравствует SO – abumusamq 10 January 2014 в 05:56

Потому что вы могли бы сделать это с определенной целью. Это не примитив. Может быть, конструктор и деструктор делают что-то важное?

У MFC даже были классы, которые работали таким образом, вы могли бы сделать это:

void foo()
{
    CWaitCursor cursor;

    [...]
}

Это отобразило бы значок песочных часов на время функция.

2
ответ дан EboMike 20 August 2018 в 18:47
поделиться

istream_iterator<string> имеет конструктор, поэтому объявление EOS на самом деле не является no-op, как и объявления i и x.

Часто вы хотите объявить объект класса, а затем ничего не делать с ним. Например, рассмотрите std::lock_guard в C ++ 0x (boost::scoped_lock в Boost) или в любом другом классе защиты области видимости. Обычно вы ничего не хотите делать с таким объектом, просто хотите создать объект, чтобы его деструктор запустился в конце блока для выполнения любой очистки, которую нужно выполнить.

6
ответ дан James McNellis 20 August 2018 в 18:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: