I have recently watched a video explaining that allocating data sequentially is very good for performance. It also showed how using "OOP approach" can slow down applications. To me this seems similar in some way to this brilliant question. Having this in mind, I concluded that calling a virtual method requires 2 indirections (which breaks caching if function access object fields?) and one jump(which breaks pipelining?). Calling a non-virtual method, requires 1 indirection(which still breaks caching?).
Nowadays, OOP is super-extensively used. Are there any attempts to optimize methods (virtual and non-virtual) calls so that they are more friendly to processor cache and pipeline? Perhaps runtimes (.NET, JVM, LLVM) can do some optimizations? Or perhaps modern processors are smart enough that we do not have to worry about that?