Проблема как раз не в таких простых циклах, а ветвящихся.
К примеру, 20 A(i) объектов порождают свои 20 B(j) объектов, а те — порождают C(k) объекты — и B(j).C(k) ссылается на A(k+j+i % 20). Будет ли тут циклическая связь?
Т.е. нужно вести или прямой граф A(i) -> B(j) -> C(k), но там проблема в том, что A не узнает о C без специальной магии, или обратный C(k) -> B(j) -> A(i), и тут возникает проблема — как найти все C, на которые ссылается данный A(i). И, разумеется, для объекта с 3 byte полями вести такие списки крайне накладно — две ссылки на родительские объекты (каждая — в 64 бита) уже окажутся больше по объему памяти для такого объекта (с учетом выравнивания).
Есть, конечно, эффективные имплементации деревьев и хэш-таблиц (и других похожих структур), но для управления кусочками памяти по 16 байт вся эта мощь, как из гаубицы по колибри.