While I'm a huge fan of ECS systems (through reading, not through use), I'm with frob in thinking that you might be jumping the gun.
You're using ECS because you think it might be "better" in areas you don't need, because it sounds cool and because everyone is talking about it and it's new and trendy (to most people anyway - I've been reading about it since 2006, and it's been around (in various forms) since at least 1996).
My advice would be to forget about writing fast code, optimize for code that is easy to read; optimize for code that is easy to develop with; optimize for actually finishing a project.
Don't use ECS because you think it'll make your code faster. Use ECS only if you think it'll make your code cleaner, your development quicker, your life easier.
And by "development easier" I don't mean some complex file-driven assembling of entities in an infinite combination of pointless possibilities that you'll rarely actually need.
And if you are making an 'engine' - don't. Make a game instead (from scratch or otherwise). Unless you want an engine instead of a game, which is also a fun project, but one that doesn't lead to actual games getting made. What I mean is, if you are making an engine with the illusion that you'll use it to make a game, then you are shooting yourself in the foot. But if you make a game by necessity you'll also make a engine - albeit an adhoc one; and you can later refine and reuse that adhoc engine.
If you insist on ECS, then I have to ask these questions:
1. Entity - pointer to the World + unique id
Why does it have a pointer to the world? Why does the Entity even exist?
Entities don't own the world (as much as they might wish :wink:), the World owns the entities.
Further, Entities shouldn't own their ID, IDs are used to locate the Entity (or rather, the components belonging to that entity).
2. Component - pure struct without logic
Good.
3. System - storage and processing logic of components with type T. All components stored in a continuous memory area (aka array or vector)
Why are all components stored in an array or vector?
I hope you have double-indirection of your IDs, or you'll be wasting alot of performance and memory trying to filter which entities you need to process.
4. 1 Component = 1 System
Why? What if a System logically makes sense managing two or three related component types?
Why does the System own the components?
Some Systems should own some components, hidden behind-the-scenes, other sets of components should be more public and shared by many systems.
5. Intersystem interaction occurs via messaging
Function calls are "messaging". What kind of messaging are you talking about?
If SystemX needs to talk to SystemY, why doesn't SystemX just have a reference to SystemY - why over-complicate it?
6. If I need share some components I need a new component + system.
Why? If you need to share some components, why not just hand the components to all the systems that need it?