There are too many differences (memory handling, CPU architecture, bus, etc.) between a 32-bit and 64-bit CPU to get into here, but the biggest and most obvious difference is addressable memory (i.e. how far your pointer can go).
Take the following code for example:
#include <iostream>
int main(int argc, char* argv[])
{
// this is just to demonstrate 32 vs. 64
int* x = (int*)0xFFFFFFFFFFFFFFFF;
int* y = (int*)0x00000000FFFFFFFF;
std::cout << std::hex <<
"&x = " << x << std::endl <<
"&y = " << y << std::endl;
if (y == x) {
std::cout << "RIGHT!" << std::endl;
} else {
std::cout << "WRONG!" << std::endl;
}
return 0;
}
Q: What do you think will be printed on a 32-bit machine vs. a 64-bit machine?
A: A very different result!
As you can see from the above code, if I expect x
to equal y
and test this on a 32-bit machine, then things will go as I expect and my code will run fine and everyone's happy! But then I pass this code to a friend who has to recompile for their 64-bit machine and they are most certainly not happy since all they see is WRONG!
I won't go deep into the other differences of 32 vs. 64 (like device and system drivers, or kernel modules) since it's beyond the scope of this forum, but hopefully the above code can illustrate why building for a 32-bit machine and then re-compiling for a 64-bit machine isn't as cut and dry as one would initially think.
So to answer some of your questions more directly:
Then, what do I get ? Any benefits?
It depends on what you're trying to do. If you have a program that will never reach the limits of 32-bit CPU's then you won't necessarily see any benefits of building for a 64-bit CPU, and depending on the CPU and OS, you might actually see a degradation in performance (as was the case in the early days of 32-bit emulation on 64-bit CPU's), but with modern cores and OS's, this is largely a non-issue for the "average" program (save the fact that you can't access more than 4GB of RAM).
However, if you have a project that would consume massive amounts of memory (like a web-browser), or need to do calculations for very large sets of numbers (like 3D calculations), then you will most certainly see a benefit in the fact that you can address more than 4GB of RAM or larger resolution numbers for your 64-bit build.
It just depends on the scope of your project and what architectures you're willing to support.
For example, Google Chrome right now is unsupported in 32 bit, but not in 64 bit. Which could be the reason?
Only the Chrome team can specifically tell you why to this one, but my guess has to do with a couple of reasons.
First is the fact that 32-bit CPU's are largely dying out and thus killing off support for a dying architecture means they can focus on improving the 64-bit architecture.
The second reason probably has to do with memory; the 64-bit version of Chrome can access more than 4GB of RAM (assuming the system has more than that) and thus a 64-bit machine with 8GB of RAM would be able to handle more browser sessions and potentially be more responsive (to the individual sessions) than on a 32-bit machine.
Additionally, Wiki has a pretty good page that details more of the 32-bit to 64-bit transition and the various considerations, should you be interested in diving in more on the differences.
Hope that can help.