A general software defense mechanism would probably have to either intercept all memory accesses or insert code after each memory access.
In either case, extra memory accesses would be needed since checksums need to be loaded from memory. This would also make cache misses more frequent, since checksum data would evict non-checksum data from cache constantly. This would have a huge performance impact - most software contains a LOT of memory accesses.
However, it might be feasible to mitigate this in specific cases by having custom code in software that needs to be secure.