Changeset 63 in dev for BasicCompiler_Common/Class.cpp
- Timestamp:
- Feb 23, 2007, 2:12:26 AM (18 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
BasicCompiler_Common/Class.cpp
r62 r63 409 409 return methods[DestructorMemberSubIndex]; 410 410 } 411 412 //サイズを取得 413 int CClass::GetSize() const 414 { 415 return GetMemberOffset( NULL, NULL ); 416 } 417 418 //メンバのオフセットを取得 419 int CClass::GetMemberOffset( const char *memberName, int *pMemberNum ) const 420 { 421 int i,i2,offset; 422 423 //仮想関数が存在する場合は関数リストへのポインタのサイズを追加 424 if(vtbl_num) offset=PTR_SIZE; 425 else offset=0; 426 427 int alignment; 428 if(iAlign) alignment=iAlign; 429 else alignment=1; 430 431 int iMaxAlign=0; 432 for(i=0;i<iMemberNum;i++){ 433 CMember *pMember = ppobj_Member[i]; 434 435 i2 = pMember->GetSize(); 436 437 //アラインメントを算出 438 int member_size; 439 if(pMember->TypeInfo.type==DEF_OBJECT){ 440 //メンバクラスのアラインメントを取得 441 member_size=pMember->TypeInfo.u.pobj_Class->GetAlignment(); 442 } 443 else{ 444 //メンバサイズを取得 445 member_size=i2; 446 } 447 if(iMaxAlign<member_size) iMaxAlign=member_size; 448 449 //アラインメントを考慮 450 if(iAlign&&iAlign<member_size){ 451 if(offset%alignment) offset+=alignment-(offset%alignment); 452 } 453 else{ 454 if(alignment<member_size) alignment=member_size; 455 456 if(member_size==0){ 457 //メンバを持たないクラス 458 //※何もしない(オフセットの計算をしない) 459 } 460 else{ 461 if(offset%member_size) offset+=member_size-(offset%member_size); 462 } 463 } 464 465 if(memberName){ 466 //メンバ指定がある場合は、オフセットを返す 467 if(lstrcmp(pMember->name,memberName)==0){ 468 if(pMemberNum) *pMemberNum=i; 469 return offset; 470 } 471 } 472 473 //配列を考慮したメンバサイズを取得 474 member_size=i2 * JumpSubScripts(pMember->SubScripts); 475 476 //メンバサイズを加算 477 offset+= member_size; 478 } 479 480 if(iMaxAlign<alignment) alignment=iMaxAlign; 481 482 //アラインメントを考慮 483 if(alignment){ 484 if(offset%alignment) offset+=alignment-(offset%alignment); 485 } 486 487 if(pMemberNum) *pMemberNum=i; 488 return offset; 489 } 490 491 int CClass::GetAlignment() const 492 { 493 int i; 494 int alignment,member_size; 495 496 if(vtbl_num) alignment=PTR_SIZE; 497 else alignment=0; 498 499 for(i=0;i<iMemberNum;i++){ 500 CMember *pMember = ppobj_Member[i]; 501 502 if(pMember->TypeInfo.type==DEF_OBJECT && pMember->IsRef() == false){ 503 //メンバクラスのアラインメントを取得 504 member_size=pMember->TypeInfo.u.pobj_Class->GetAlignment(); 505 } 506 else{ 507 //メンバサイズを取得 508 member_size = pMember->GetSize(); 509 } 510 511 //アラインメントをセット 512 if(alignment<member_size) alignment=member_size; 513 } 514 515 if(alignment==0) return 0; 516 517 if(iAlign) alignment=iAlign; 518 519 return alignment; 520 } 521 411 522 412 523
Note:
See TracChangeset
for help on using the changeset viewer.