这个你说得不对。首先C语言不论指针的值还是sizeof,都是以char为单位的。不论它内部用什么指令实现,memcpy(dst,src,N)一定是复制了N个char。那么它最朴素的实现,也就是一个char*上的循环。
当然今天以前,我会觉得char不是8位只是理论上的可能性,你在memcpy里用u8也没问题。但是现在我们知道,确实有编译器可以设定为16位char,那么在此模式下memcpy的长度参数必定是以16位为单位计数的。如果两个指针的值差1,它们之间也必定差16位。
【 在 feiy 的大作中提到: 】
: 若想最终确认你的说法在各个场景对不对,最好的办法对着编译结果(上下几条汇编)看看吧,他用啥指令搬运,8位指令还是32位的搬运指令,也可能优化的目的,混杂都有。这是最靠谱方法。所以你说的不绝对,memcpy之类基本还是以8-bit字节为计数,指向的缓冲区或内存地址,依然可以视作是以字节为计数的,所以你用u8*大概率毫无问题(最多个可忽视不影响的warning),严格说来,u8*这是个指标本身不是8位的,可能是32位的。只是在某些平台某些场合上有类似32位对齐的要求,就是u8*这个指针的值(地址)必须是32位对齐的,但不代表是按32位复制,或必须是u16*或u32*。
: 不知我表达清楚没有,你酌情看吧。扯远了,估计一些人看着会懵认为是啥也没说瞎扯淡了。我的回答是,不一定,看编译结果。
: --来自微水木3.5.11
--
FROM 114.86.93.*