Ну да, если вы хотите сослаться на данные в Shared memory, то храните смещение, например относительно начала блока. ОС замапить может в любое свободное место доступной процессу виртуальной памяти.
1. Грубо говоря, выигрыша вообще не будет
2. Ну в тот же PHP встроить тот еще геморой
3. Качество кода программистов, содержание которых обходится дешевле содержания разработчиков C++ ниже плинтуса.
GUID и сам-то не гарантирует строгой уникальности в целом, только в определенной замкнутой системе. Ну и к примеру для шардинга всё куда как проще может быть. Если знаете какое хранилище использовать, то спокойно заводите счетчик для каждого хранилища и выставляете нужное кол-во старших бит, чтобы точно идентифицировать нужную ноду. В вашем случае всего 1 бит. Или даже грубо можно использовать знаковое число, для одной ноды плюсовать от 1, для другой минусовать от -1.
Можно, сделать одиночные индексы на каждое поле и вытаскивать через OR, но увы, не всегда вменяемо это может работать (в плане использования индексов).
Ну уж так категорично говорить, что std::string, вообще в C++ нет понятия строки, есть понятие указатель на блок памяти, я могу адрес и в long запихать или long long. И адрес будет указывать на начало блока строки, а еще могу и память иначе организовать и будет указывать на конец.