Re: bitset<32> and bitset<64> efficiency
On 29/11/2012 01:38, W Karas wrote:
It seems that typical C++ compilers will often fail to inline, even
when doing so would result in object code that was BOTH smaller and
faster. It's a very frustrating aspect of using C++. Can anyone
comment on why this is the case? In the case of GCC, I suppose one
cannot look a gift-horse in the mouth. But the problem seems to
exist with compilers which must be licensed at significant cost as
well.
Just make sure to compile with optimizations on:
!int main(int argc, char ** argv) {
main(int, char**)()
main(int, char**)+0: push %rbp
main(int, char**)+6: push %rbx
main(int, char**)+7: mov %edi,%ebx
main(int, char**)+14: sub $0x28,%rsp
! std::bitset<64> i, j;
main(int, char**)+18: movq $0x0,(%rsp)
main(int, char**)+26: movq $0x0,0x10(%rsp)
! std::cerr << sizeof(i) << std::endl;
! __asm__ __volatile__("nop");
main(int, char**)+48: nop
! i.set(argc);
main(int, char**)+49: movslq %ebx,%rax
! __asm__ __volatile__("nop");
main(int, char**)+79: nop
! std::cerr << i << std::endl;
main(int, char**)+80: mov $0x744dc0,%edi
main(int, char**)+85: mov %rsp,%rsi
main(int, char**)+88: callq 0x4014f0 <std::operator<< <char,
std::char_traits<char>, 64ul>(std::basic_ostream<char,
std::char_traits<char> >&, std::bitset<64ul> const&)>
! __asm__ __volatile__("nop");
main(int, char**)+101: nop
! j.set(64 - argc);
main(int, char**)+102: mov $0x40,%ecx
main(int, char**)+107: sub %ebx,%ecx
main(int, char**)+109: movslq %ecx,%rdx
! __asm__ __volatile__("nop");
main(int, char**)+129: nop
! std::cerr << j << std::endl;
main(int, char**)+130: lea 0x10(%rsp),%rsi
main(int, char**)+135: mov $0x744dc0,%edi
main(int, char**)+140: callq 0x4014f0 <std::operator<< <char,
std::char_traits<char>, 64ul>(std::basic_ostream<char,
std::char_traits<char> >&, std::bitset<64ul> const&)>
! __asm__ __volatile__("nop");
main(int, char**)+153: nop
! i ^= j;
! __asm__ __volatile__("nop");
main(int, char**)+163: nop
! std::cerr << i << std::endl;
main(int, char**)+164: mov $0x744dc0,%edi
main(int, char**)+169: mov %rsp,%rsi
main(int, char**)+172: callq 0x4014f0 <std::operator<< <char,
std::char_traits<char>, 64ul>(std::basic_ostream<char,
std::char_traits<char> >&, std::bitset<64ul> const&)>
! return 0;
!}
main(int, char**)+185: add $0x28,%rsp
main(int, char**)+189: xor %eax,%eax
main(int, char**)+191: pop %rbx
main(int, char**)+192: pop %rbp
main(int, char**)+193: retq
--- news://freenews.netfront.net/ - complaints: news@netfront.net ---