A method comprising: specifying a base address and a limit address within a memory address space to define a memory region, memory addresses within said memory region sharing at least one attribute, said base address and said limit address being subject to some degree of alignment, for example, 32-byte or 64-byte alignment, so that a number of the lowest significant bits of the limit address and the base address are all zeros, and comparing a query address with said base address and said limit address to determine if said query address is within said memory region; and if said query address is within said memory region, then: identifying a memory block within said memory address space including said query address and contiguously extending between a lower block address LBA and an upper block address UBA, where: UBA-LBA = 2 X, where X is an integer greater than or equal to zero; LBA = N ∗ 2 X, where N is an integer greater than or equal to zero; and selecting X and N such that said memory block lies wholly within said memory region, wherein X is selected to have a maximum integer value for which there is an integer value of N that permits said memory block to lie wholly within said memory region; storing block data representing said memory block, wherein said block data comprises a mask value and an old query value representing said query address used in said identifying of said memory block; and using said block data to determine if a subsequent query address lies within said memory region, wherein said using said block data comprises determining whether a logical operation between said mask value and said old query value matches said logical operation between said mask value and a new query value representing said subsequent query address. specifying a base address and a limit address within a memory address space to define a memory region, memory addresses within said memory region sharing at least one attribute, said base address and said limit address being subject to some degree of alignment, for example, 32-byte or 64-byte alignment, so that a number of the lowest significant bits of the limit address and the base address are all zeros, and comparing a query address with said base address and said limit address to determine if said query address is within said memory region; and if said query address is within said memory region, then: identifying a memory block within said memory address space including said query address and contiguously extending between a lower block address LBA and an upper block address UBA, where: UBA-LBA = 2 X, where X is an integer greater than or equal to zero; LBA = N ∗ 2 X, where N is an integer greater than or equal to zero; and selecting X and N such that said memory block lies wholly within said memory region, wherein X is selected to have a maximum integer value for which there is an integer value of N that permits said memory block to lie wholly within said memory region; storing block data representing said memory block, wherein said block data comprises a mask value and an old query value representing said query address used in said identifying of said memory block; and using said block data to determine if a subsequent query address lies within said memory region, wherein said using said block data comprises determining whether a logical operation between said mask value and said old query value matches said logical operation between said mask value and a new query value representing said subsequent query address. identifying a memory block within said memory address space including said query address and contiguously extending between a lower block address LBA and an upper block address UBA, where: UBA-LBA = 2 X, where X is an integer greater than or equal to zero; LBA = N ∗ 2 X, where N is an integer greater than or equal to zero; and selecting X and N such that said memory block lies wholly within said memory region, wherein X is selected to have a maximum integer value for which there is an integer value of N that permits said memory block to lie wholly within said memory region; UBA-LBA = 2 X, where X is an integer greater than or equal to zero; LBA = N ∗ 2 X, where N is an integer greater than or equal to zero; and selecting X and N such that said memory block lies wholly within said memory region, wherein X is selected to have a maximum integer value for which there is an integer value of N that permits said memory block to lie wholly within said memory region; storing block data representing said memory block, wherein said block data comprises a mask value and an old query value representing said query address used in said identifying of said memory block; and using said block data to determine if a subsequent query address lies within said memory region, wherein said using said block data comprises determining whether a logical operation between said mask value and said old query value matches said logical operation between said mask value and a new query value representing said subsequent query address.