I think I used a table because if the ptr changes then you have to make an epoll_ctl() syscall to change each and every one.
If we use an array of objects then ptrs could be preserved.  I approached this as "minimal changes" to what was there, for less risk.