2015-02-20 2 views
1

Я возвращаю три элемента из функции в виде std::tuple.Кортеж как тип возвращаемого значения, не удовлетворенные значения оптимизированы?

... myFunction() 
{ 
    ... 
    return std::tuple< int, unsigned long long, unsigned int >{ errorCode, timeStamp, sizeOfBuffer }; 
} 

Поскольку возвращаемые значения должны быть доступны с помощью std::get или std::tie, делает Оптимизировать компилятор для неиспользуемых значений (G ++ 4.8)?

+2

Я думаю, что единственный способ, чтобы знать наверняка, чтобы исследовать сгенерированный код. – StilesCrisis

+1

Ответ может быть, но, вероятно, нет. Потому что «g ++» может быть невозможно определить, имеет ли копия ctor какие-либо побочные эффекты. Но в этом случае вы используете POD, так что это возможность. – OmnipotentEntity

+0

@StilesCrisis, yikes! Это, безусловно, вариант (я бы предпочел избежать, если это возможно). Я уже думаю, что может быть более интуитивным, чтобы вернуть структуру ... Это просто кажется более увлекательным. – DaveyLaser

ответ

6

Да, может. http://goo.gl/UB7DNc

#include "stdio.h" 
#include <tuple> 

std::tuple<int, unsigned long long, unsigned int> myFunction() 
{ 
    return std::tuple<int, unsigned long long, unsigned int>{ 1, 2, 3 }; 
} 

int f() 
{ 
    return std::get<0>(myFunction()); 
} 

Становится

myFunction(): 
    movq %rdi, %rax 
    movl $3, (%rdi) 
    movq $2, 8(%rdi) 
    movl $1, 16(%rdi) 
    ret 
f(): 
    movl $1, %eax 
    ret 
+1

Теперь я понимаю. Это показывает, что значения скомпилированы. Это связано с тем, что, когда 'f' вызывает' myFunction', он физически не вызывает его, но возвращает соответствующее значение напрямую. Хотя сборка для 'myFunction' скомпилирована, функция была встроена и оптимизирована в' f'. Однако я бы не считал это окончательным для всех случаев, поскольку это был только простой пример тестирования. –

+3

@remyabel Вы видели URL-адреса, с которыми сталкивается gcc.godbolt.org? И он автоматически сокращает URL-адрес. – Praetorian

+0

Спасибо, ребята. Оба они поддержали, чтобы дать ответ Стайлсу, так как он ответил первым. Несмотря на то, что он предположил, что я боюсь собрания. : P Не потому, что мы пишем C++? – DaveyLaser

Смежные вопросы